Re: seg fault on dsm_create call - Mailing list pgsql-hackers
From | Max Fomichev |
---|---|
Subject | Re: seg fault on dsm_create call |
Date | |
Msg-id | ed698b3a-9cbd-9179-6a2d-e8c957225523@gmail.com Whole thread Raw |
In response to | Re: seg fault on dsm_create call (Robert Haas <robertmhaas@gmail.com>) |
Responses |
Re: seg fault on dsm_create call
|
List | pgsql-hackers |
On 28/06/16 19:24, Robert Haas wrote: > On Tue, Jun 28, 2016 at 10:11 AM, Max Fomichev <max.fomitchev@gmail.com> wrote: >> Hello, >> sorry for my repost from psql-novice, probably it was not a right place for >> my question. >> >> I'm trying to understand how to work with dynamic shared memory, message >> queues and workers. >> The problem is I can not initialize any dsm segment - >> >> void _PG_init() { >> ... >> dsm_segment *seg = dsm_create(32768, 0); // Segmentation fault here >> ... >> BackgroundWorker worker; >> sprintf(worker.bgw_name, "mystem wrapper process"); >> worker.bgw_flags = BGWORKER_SHMEM_ACCESS; >> worker.bgw_start_time = BgWorkerStart_RecoveryFinished; >> worker.bgw_restart_time = BGW_NEVER_RESTART; >> worker.bgw_main = mainProc; >> worker.bgw_notify_pid = 0; >> RegisterBackgroundWorker(&worker); >> } >> >> Also I was trying to move dsm_create call to a worker, but with the same >> result - >> >> static void mainProc(Datum) { >> ... >> dsm_segment *seg = dsm_create(32768, 0); // Segmentation fault here >> ... >> pqsignal(SIGTERM, mystemSigterm); >> BackgroundWorkerUnblockSignals(); >> ... >> >> What could be a reason and what am I doing wrong? > I think there are two problems. > > 1. You need to set up a ResourceOwner before you can attach to a DSM > segment. Something like: CurrentResourceOwner = > ResourceOwnerCreate(NULL, "name of my extension"). > > 2. You can't do this from inside a _PG_init() block. That will run in > every process that loads this, which is probably not what you want, > and it will run in the postmaster also, which will not work: the > postmaster cannot use DSM. > > Actually, I'd like to change #1 at some point, so that if > CurrentResourceOwner = NULL and you create or attach to a DSM, you > just get a backend-lifespan mapping. The current setup is annoying > rather than helpful. But currently that's how it is. > Thanks. It works now with CurrentResourceOwner = ResourceOwnerCreate(NULL, "name of my extension") I am a little bit confused about test/modules/test_shm_mq, where CurrentResourceOwner is set up before dsm_attach, not dsm_create - /* * Connect to the dynamic shared memory segment. * * The backend that registered this worker passed usthe ID of a shared * memory segment to which we must attach for further instructions. In * order to attach todynamic shared memory, we need a resource owner. * Once we've mapped the segment in our address space, attach to the table * of contents so we can locate the various data structures we'll need to * find within the segment. */ CurrentResourceOwner = ResourceOwnerCreate(NULL, "test_shm_mq worker"); seg = dsm_attach(DatumGetInt32(main_arg)); -- Best regards, Max Fomichev
pgsql-hackers by date: