pointer scope and memory contexts

Поиск
Список
Период
Сортировка
От Tim Keitt
Тема pointer scope and memory contexts
Дата
Msg-id 6262c54c0811051731s90245a1nea1321652d77c3d@mail.gmail.com
обсуждение исходный текст
Ответы Re: pointer scope and memory contexts  ("Pavan Deolasee" <pavan.deolasee@gmail.com>)
Re: pointer scope and memory contexts  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
I am working on a set returning function and have a question about
switching memory contexts. Basically, what I want to know is whether
memory allocated in one context can be referenced when a different
context is current.  The docs give examples like:
   if (SRF_IS_FIRSTCALL())   {       funcctx = SRF_FIRSTCALL_INIT();       oldcontext =
MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
       /* allocate some memory that needs to span calls */       my_ptr = (a_type *) palloc(size);
       MemoryContextSwitchTo(oldcontext);   }
   funcctx = SRF_PERCALL_SETUP();
   /* can I now dereference here? Is it necessary to manually switch
to multi_call_memory_ctx? */   some_function(my_ptr[0]);   ...

In a related question, do I only need to switch to
multi_call_memory_ctx when allocating memory that needs to be
referenced in subsequent calls? Would the following make sense?
   if (SRF_IS_FIRSTCALL())   {       funcctx = SRF_FIRSTCALL_INIT();
       /* this will be deallocated at the end of the first call, right? */       scratch_ptr = (a_type *)
palloc(size);
       oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);       /* allocate some memory that needs to
spancalls */       my_ptr = (a_type *) palloc(size);       MemoryContextSwitchTo(oldcontext);
 
       /* can I dereference my_ptr here? */       func_called_once(scratch_ptr, my_ptr);
       ...
   }
   /* per call stuff follows... */

In other words, if I have allocations that only are needed during the
first call, can I allocate them outside of the multi_call_memory_ctx
(so that they do not live past the first call) and only allocate the
memory needed for multiple calls within the multi_call_memory_ctx?

One last question: if I call SPI_finish, on the first call, do I need
to switch contexts in the per-call section? (I saw some example code
that suggested one needs to switch contexts back to
multi_call_memory_ctx after SPI_finish.)

Thanks.

THK

-- 
Timothy H. Keitt
http://www.keittlab.org/


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Alvaro Herrera
Дата:
Сообщение: Re: RAM-only temporary tables
Следующее
От: KaiGai Kohei
Дата:
Сообщение: Re: The suppress_redundant_updates_trigger() works incorrectly