Re: Foreign memory context read - Mailing list pgsql-hackers

From Vaibhav Kaushal
Subject Re: Foreign memory context read
Date
Msg-id BANLkTinnZL9gS31vhGTfBnQ6Gi288jRp-A@mail.gmail.com
Whole thread Raw
In response to Re: Foreign memory context read  (Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>)
Responses Re: Foreign memory context read  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Well, I had thought of the same what you said. 

My mind started wandering after that error. Now, actually, i was trying to do something like this:

*last_result = palloc0(sizeof(Datum));
bool *isnnuull = true;
*last_result = slot_getattr(slot, num_atts, *isnnuull);
elog(INFO, "Last result for slot_getattr = %d", (int)last_result);

Just before:

if (!qual || ExecQual(qual, econtext, false))
{
/*
* Found a satisfactory scan tuple.
*/
in ExecScan. 

Do you think its the 'slot_getattr' causing the seg-fault?

Regards,
Vaibhav


On Mon, May 23, 2011 at 4:53 PM, Heikki Linnakangas <heikki.linnakangas@enterprisedb.com> wrote:
On 23.05.2011 13:44, Vaibhav Kaushal wrote:
Hello,

I made some code changes, compilation went fine but the database could not
start with the message:

LOG:  server process (PID 17684) was terminated by signal 11: Segmentation
fault

I think this is because of memory allocation outside of any memory context.

There's always a memory context active, it just might not be the correct one.


Is it possible to create some variable in a memory context (say
"cut_context") and then access the variable in that context from a piece of
code which is working with variables in a different context (say the
"per_query" context)?

If yes, then how?

Sure, for accessing a variable, it doesn't matter which memory context it was allocated in. As long as you make sure you allocate things in sufficiently long-lived memory contexts, so that your allocations are not free'd too early, while they're still needed by some code.


My first guess is a Memory Context switch. But then, I need to bring in the
value of the variable from the cut_context (which was formed earlier) to the
per_query context which was created later on.

Precisely I am trying to create a small array of Datums (before the ExecQual
is called inside ExecScan) and then use the array inside the ExecEvalVar
(which obviously is inside the executer).

Switching to the right memory context before the palloc() call is the key. Sounds like you want to allocate your array in the per-query memory context. If you need to move a value from one memory context to another, like if you need to take a Datum that's already been allocated in some other memory context, and store it in that array, you need to copy the Datum to the right memory context.

--
 Heikki Linnakangas
 EnterpriseDB   http://www.enterprisedb.com

pgsql-hackers by date:

Previous
From: Heikki Linnakangas
Date:
Subject: Re: Foreign memory context read
Next
From: "Kevin Grittner"
Date:
Subject: Re: Foreign memory context read