@@ -68,8 +68,7 @@ static shm_mq *recv_mq = NULL;
6868static shm_mq_handle * recv_mqh = NULL ;
6969
7070/* LWLock pointers */
71- static LWLock * queue_lock ;
72- LWLock * collector_lock ;
71+ pgwsLockSharedState * pgws_lss ;
7372
7473/* Hook functions */
7574#if PG_VERSION_NUM >= 150000
@@ -258,7 +257,7 @@ pgws_shmem_request(void)
258257static void
259258pgws_shmem_startup (void )
260259{
261- bool found ;
260+ bool found , locks_found ;
262261 Size segsize = pgws_shmem_size ();
263262 void * pgws ;
264263 shm_toc * toc ;
@@ -270,9 +269,6 @@ pgws_shmem_startup(void)
270269 if (!found )
271270 {
272271 /* Create shared objects */
273- queue_lock = & (GetNamedLWLockTranche (PGWS_QUEUE_LOCK_NAME ))-> lock ;
274- collector_lock = & (GetNamedLWLockTranche (PGWS_COLLECTOR_LOCK_NAME ))-> lock ;
275-
276272 toc = shm_toc_create (PG_WAIT_SAMPLING_MAGIC , pgws , segsize );
277273
278274 pgws_collector_hdr = shm_toc_allocate (toc , sizeof (CollectorShmqHeader ));
@@ -293,6 +289,14 @@ pgws_shmem_startup(void)
293289 pgws_proc_queryids = shm_toc_lookup (toc , 2 , false);
294290 }
295291
292+ pgws_lss = ShmemInitStruct ("pg_wait_sampling_locks" , sizeof (pgwsLockSharedState ), & locks_found );
293+
294+ if (!locks_found )
295+ {
296+ pgws_lss -> queue_lock = & (GetNamedLWLockTranche (PGWS_QUEUE_LOCK_NAME ))-> lock ;
297+ pgws_lss -> collector_lock = & (GetNamedLWLockTranche (PGWS_COLLECTOR_LOCK_NAME ))-> lock ;
298+ }
299+
296300 shmem_initialized = true;
297301
298302 LWLockRelease (AddinShmemInitLock );
@@ -319,7 +323,7 @@ pgws_cleanup_callback(int code, Datum arg)
319323{
320324 elog (DEBUG3 , "pg_wait_sampling cleanup: detaching shm_mq and releasing queue lock" );
321325 shm_mq_detach (recv_mqh );
322- LWLockRelease (queue_lock );
326+ LWLockRelease (pgws_lss -> queue_lock );
323327}
324328
325329/*
@@ -656,11 +660,11 @@ receive_array(SHMRequest request, Size item_size, Size *count)
656660 MemoryContext oldctx ;
657661
658662 /* Ensure nobody else trying to send request to queue */
659- LWLockAcquire (queue_lock , LW_EXCLUSIVE );
660- LWLockAcquire (collector_lock , LW_EXCLUSIVE );
663+ LWLockAcquire (pgws_lss -> queue_lock , LW_EXCLUSIVE );
664+ LWLockAcquire (pgws_lss -> collector_lock , LW_EXCLUSIVE );
661665 recv_mq = shm_mq_create (pgws_collector_mq , COLLECTOR_QUEUE_SIZE );
662666 pgws_collector_hdr -> request = request ;
663- LWLockRelease (collector_lock );
667+ LWLockRelease (pgws_lss -> collector_lock );
664668
665669 /*
666670 * Check that the collector was started to avoid NULL
@@ -720,7 +724,7 @@ receive_array(SHMRequest request, Size item_size, Size *count)
720724
721725 /* We still have to detach and release lock during normal operation. */
722726 shm_mq_detach (recv_mqh );
723- LWLockRelease (queue_lock );
727+ LWLockRelease (pgws_lss -> queue_lock );
724728
725729 return result ;
726730}
@@ -828,10 +832,10 @@ pg_wait_sampling_reset_profile(PG_FUNCTION_ARGS)
828832{
829833 check_shmem ();
830834
831- LWLockAcquire (queue_lock , LW_EXCLUSIVE );
832- LWLockAcquire (collector_lock , LW_EXCLUSIVE );
835+ LWLockAcquire (pgws_lss -> queue_lock , LW_EXCLUSIVE );
836+ LWLockAcquire (pgws_lss -> collector_lock , LW_EXCLUSIVE );
833837 pgws_collector_hdr -> request = PROFILE_RESET ;
834- LWLockRelease (collector_lock );
838+ LWLockRelease (pgws_lss -> collector_lock );
835839
836840 /*
837841 * Check that the collector was started to avoid NULL
@@ -843,7 +847,7 @@ pg_wait_sampling_reset_profile(PG_FUNCTION_ARGS)
843847
844848 SetLatch (pgws_collector_hdr -> latch );
845849
846- LWLockRelease (queue_lock );
850+ LWLockRelease (pgws_lss -> queue_lock );
847851
848852 PG_RETURN_VOID ();
849853}
0 commit comments