Adding callback support.

Started by Nicolai Petriover 20 years ago2 messages
#1Nicolai Petri
lists@petri.cc

Hi ppl,

I'm currently building some stored procedures in C that uses some internal
hash tables - It could be really nice to be able to deallocate those
correctly when e.g. a memctx is destroyed. Would it be possible to add this
as a postgresql feature and how should it be done.

I also have some other tasks where I would like to do specific actions when a
transaction completes or aborts. This could be used for maintaining a
pgmemcache correctly and many other cases. Could this be combined with the
above feature so a generic callback framework was added ?

I was thinking something like :
register_callback(my_func, (void*) myprivatedata,
CB_ON_TRNSACT_OK|CB_ON_TRNSACT_ABORT );

Other flags could be on CB_ON_QUERY_DONE/ABORTED, CB_ON_CONNETION_CLOSED

I wouldn't mind trying to do patches if they would be accepted for 8.1 or 8.2
but I would if we could settle for an API before I start coding anything.

---
Nicolai Petri

#2Alvaro Herrera
alvherre@dcc.uchile.cl
In reply to: Nicolai Petri (#1)
Re: Adding callback support.

On Tue, May 10, 2005 at 09:36:59AM +0200, Nicolai Petri wrote:

I'm currently building some stored procedures in C that uses some internal
hash tables - It could be really nice to be able to deallocate those
correctly when e.g. a memctx is destroyed. Would it be possible to add this
as a postgresql feature and how should it be done.

Why don't you just create the hash table inside a context that has the
right longevity? For example, TopTransactionContext. So at transaction
end the hash table is automatically freed.

I also have some other tasks where I would like to do specific actions when a
transaction completes or aborts. This could be used for maintaining a
pgmemcache correctly and many other cases. Could this be combined with the
above feature so a generic callback framework was added ?

Hmm, is there anything the following functions don't do for you:

extern void RegisterXactCallback(XactCallback callback, void *arg);
extern void UnregisterXactCallback(XactCallback callback, void *arg);
extern void RegisterSubXactCallback(SubXactCallback callback, void *arg);
extern void UnregisterSubXactCallback(SubXactCallback callback, void *arg);

See src/backend/access/transam/xact.c

--
Alvaro Herrera (<alvherre[@]dcc.uchile.cl>)
"Ni aun el genio muy grande llegar�a muy lejos
si tuviera que sacarlo todo de su propio interior" (Goethe)