On Thu, Apr 28, 2016 at 12:56 PM, <da...@andl.org> wrote: > Does Postgres provide a convenient way for one process to pass data to > another using shared memory?
1. Look at ShmemInitStruct, ShmemInitHash (as in hash table), ShmemInitQueue in storage/shmem.h. These use memory that is mapped at the same address in every backend (process) which is convenient for sharing data structures with internal pointers. The amount of memory available is fixed at cluster startup however. 2. Look at dsm_XXX in storage/dsm.h. This subsystem provides segments of memory that is "dynamic" in the sense that it is limited only by your system's available virtual memory, but you have to explicitly attach these segment in any backend that wants to access them by passing a handle around and the memory may be mapped at any address in each backend, so you need to work harder to build data structures that reference each other (using offsets rather than pointers, that kind of thing). DSM segments won't work well if you try to create large numbers of them, so you'll need to provide a way to manage the space inside a smallish number of large chunks of DSM memory yourself (this is a problem I'm working to fix by providing a general purpose allocator backed by a bunch of DSM segments -- watch this space). LWLocks (our usual lock primitive for cases where spinlocks are inappropriate) currently don't work correctly inside DSM segments (this too will be fixed). -- Thomas Munro http://www.enterprisedb.com -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers