Re: How to manage shared library lifetime through C functions

From: Heikki Linnakangas <hlinnakangas(at)vmware(dot)com>
To: Seref Arikan <serefarikan(at)gmail(dot)com>, <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: How to manage shared library lifetime through C functions
Date: 2014-08-04 10:17:17
Message-ID: 53DF5DAD.5010607@vmware.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 08/04/2014 12:54 PM, Seref Arikan wrote:
> Greetings,
> I hope this is the right group to ask this question; apologies if this
> should go the general or some other list.
>
> I have multiple shared libraries that can be called from C that I'd like to
> use from a C based postgresql function.
>
> These libraries perform some expensive initialization and they require the
> C code to properly release resources when the library is no longer needed.
>
> This means that I need a mechanism to keep a session level pointer to a
> library, initialize it when it is called first from a C based function and
> dispose the library properly when the session ends (and terminated due to a
> problem) I would like to keep the libraries available as long as the
> session is alive, so multiple calls are supposed to avoid
> initialization/disposal costs every time.
>
> I could probably use a temp table as a container for the initalization and
> even pointer values (sounds dirty) but I have no idea how to hook to
> session end to clean up when session ends.
>
> What would be a good strategy here?

Define a function called _PG_init() in your C extension. PostgreSQL will
call it once, when the library is loaded into the backend. (The time
it's loaded will depend on whether the library is listed in
shared_preload_libraries, local_preload_libraries, or neither.)

Are you sure you need to do any cleanup? When the session ends, the
backend process will terminate, which will close any open files and
release memory that the library might be holding. If that's not enough,
and the library really needs to do more complicated clean up, then you
can register a callback with on_proc_exit().

Look at the C extensions in the PostgreSQL source tree's contrib
directory for examples of _PG_init() and on_proc_exit().

- Heikki

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Seref Arikan 2014-08-04 10:31:11 Re: How to manage shared library lifetime through C functions
Previous Message Albe Laurenz 2014-08-04 10:15:37 Re: How to manage shared library lifetime through C functions