Re: Foreign memory context read

From: Vaibhav Kaushal <vaibhavkaushal123(at)gmail(dot)com>
To: Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com>
Cc: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Foreign memory context read
Date: 2011-05-23 11:33:52
Message-ID: BANLkTinnZL9gS31vhGTfBnQ6Gi288jRp-A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(dot)linnakangas(at)enterprisedb(dot)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
>

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Kevin Grittner 2011-05-23 11:57:55 Re: Foreign memory context read
Previous Message Heikki Linnakangas 2011-05-23 11:23:33 Re: Foreign memory context read