Re: [HACKERS] Stateful C-language function with state managed by third-party library

2015-03-12 Thread Tom Lane
Denys Rtveliashvili r...@icloud.com writes:
 My function neeeds to call a third-party library which would create a state 
 and then that state should be kept for the duration of the current query. The 
 library can deallocate that state in a correct way.

 I understand that fn_extra is normally used for this and usually the state is 
 created in a memory context which is deallocated at the end of the query. So 
 normally it is not an issue. However, I cannot make that library use 
 PostgreSQL utilities for memory management.

 I am afraid that for long-running sessions it may cause serious memory leaks 
 if they do not deallocate state correctly and in a timely manner.

 Is there a mechanism for adding a finalizer hook which would be called and 
 passed that pointer after the query is complete? Or perhaps there is another 
 mechanism? I looked in the documentation and in the source but I do not see 
 it mentioned.

In HEAD, you could use a memory context reset callback for this purpose.

I don't believe there's any fully satisfactory solution in the released
branches; the closest you could get is an ExprContext callback, which
has the fatal-for-this-purpose defect that it's only called on successful
query completion, not if an error occurs.

regards, tom lane


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


[HACKERS] Stateful C-language function with state managed by third-party library

2015-03-10 Thread Denys Rtveliashvili

Hello,

My function neeeds to call a third-party library which would create a state and 
then that state should be kept for the duration of the current query. The 
library can deallocate that state in a correct way.

I understand that fn_extra is normally used for this and usually the state is 
created in a memory context which is deallocated at the end of the query. So 
normally it is not an issue. However, I cannot make that library use PostgreSQL 
utilities for memory management.

I am afraid that for long-running sessions it may cause serious memory leaks if 
they do not deallocate state correctly and in a timely manner.

Is there a mechanism for adding a finalizer hook which would be called and 
passed that pointer after the query is complete? Or perhaps there is another 
mechanism? I looked in the documentation and in the source but I do not see it 
mentioned.

Thank you.

With kind regards,
Denys Rtveliashvili