@@ -63,10 +63,13 @@ shm_mq *pgws_collector_mq = NULL;
6363uint64 * pgws_proc_queryids = NULL ;
6464CollectorShmqHeader * pgws_collector_hdr = NULL ;
6565
66- /* Receiver (backend) local shm_mq pointers and lock */
66+ /* Receiver (backend) local shm_mq pointers */
6767static shm_mq * recv_mq = NULL ;
6868static shm_mq_handle * recv_mqh = NULL ;
69- static LOCKTAG queueTag ;
69+
70+ /* LWLock pointers */
71+ static LWLock * queue_lock ;
72+ LWLock * collector_lock ;
7073
7174/* Hook functions */
7275#if PG_VERSION_NUM >= 150000
@@ -242,6 +245,10 @@ pgws_shmem_request(void)
242245 prev_shmem_request_hook ();
243246
244247 RequestAddinShmemSpace (pgws_shmem_size ());
248+
249+ /* We request two different LWLock Tranches for ease of use */
250+ RequestNamedLWLockTranche (PGWS_QUEUE_LOCK_NAME , 1 );
251+ RequestNamedLWLockTranche (PGWS_COLLECTOR_LOCK_NAME , 1 );
245252}
246253#endif
247254
@@ -256,11 +263,16 @@ pgws_shmem_startup(void)
256263 void * pgws ;
257264 shm_toc * toc ;
258265
266+ LWLockAcquire (AddinShmemInitLock , LW_EXCLUSIVE );
267+
259268 pgws = ShmemInitStruct ("pg_wait_sampling" , segsize , & found );
260269
261270 if (!found )
262271 {
263272 /* Create shared objects */
273+ queue_lock = & (GetNamedLWLockTranche (PGWS_QUEUE_LOCK_NAME ))-> lock ;
274+ collector_lock = & (GetNamedLWLockTranche (PGWS_COLLECTOR_LOCK_NAME ))-> lock ;
275+
264276 toc = shm_toc_create (PG_WAIT_SAMPLING_MAGIC , pgws , segsize );
265277
266278 pgws_collector_hdr = shm_toc_allocate (toc , sizeof (CollectorShmqHeader ));
@@ -283,6 +295,8 @@ pgws_shmem_startup(void)
283295
284296 shmem_initialized = true;
285297
298+ LWLockRelease (AddinShmemInitLock );
299+
286300 if (prev_shmem_startup_hook )
287301 prev_shmem_startup_hook ();
288302}
@@ -305,7 +319,7 @@ pgws_cleanup_callback(int code, Datum arg)
305319{
306320 elog (DEBUG3 , "pg_wait_sampling cleanup: detaching shm_mq and releasing queue lock" );
307321 shm_mq_detach (recv_mqh );
308- LockRelease ( & queueTag , ExclusiveLock , false );
322+ LWLockRelease ( queue_lock );
309323}
310324
311325/*
@@ -325,9 +339,13 @@ _PG_init(void)
325339 * resources in pgws_shmem_startup().
326340 *
327341 * If you change code here, don't forget to also report the modifications
328- * in pgsp_shmem_request () for pg15 and later.
342+ * in pgws_shmem_request () for pg15 and later.
329343 */
330344 RequestAddinShmemSpace (pgws_shmem_size ());
345+
346+ /* We request two different LWLock Tranches for ease of use */
347+ RequestNamedLWLockTranche (PGWS_QUEUE_LOCK_NAME , 1 );
348+ RequestNamedLWLockTranche (PGWS_COLLECTOR_LOCK_NAME , 1 );
331349#endif
332350
333351 pgws_register_wait_collector ();
@@ -361,7 +379,8 @@ _PG_init(void)
361379 & pgws_historySize ,
362380 5000 ,
363381 100 ,
364- INT_MAX ,
382+ /* to avoid error in collector.c:alloc_history */
383+ MaxAllocSize / sizeof (HistoryItem ),
365384 PGC_SIGHUP ,
366385 0 ,
367386 NULL ,
@@ -624,22 +643,10 @@ typedef struct
624643 ProfileItem * items ;
625644} Profile ;
626645
627- void
628- pgws_init_lock_tag (LOCKTAG * tag , uint32 lock )
629- {
630- tag -> locktag_field1 = PG_WAIT_SAMPLING_MAGIC ;
631- tag -> locktag_field2 = lock ;
632- tag -> locktag_field3 = 0 ;
633- tag -> locktag_field4 = 0 ;
634- tag -> locktag_type = LOCKTAG_USERLOCK ;
635- tag -> locktag_lockmethodid = USER_LOCKMETHOD ;
636- }
637-
638646/* Get array (history or profile data) from shared memory */
639647static void *
640648receive_array (SHMRequest request , Size item_size , Size * count )
641649{
642- LOCKTAG collectorTag ;
643650 shm_mq_result res ;
644651 Size len ,
645652 i ;
@@ -649,14 +656,11 @@ receive_array(SHMRequest request, Size item_size, Size *count)
649656 MemoryContext oldctx ;
650657
651658 /* Ensure nobody else trying to send request to queue */
652- pgws_init_lock_tag (& queueTag , PGWS_QUEUE_LOCK );
653- LockAcquire (& queueTag , ExclusiveLock , false, false);
654-
655- pgws_init_lock_tag (& collectorTag , PGWS_COLLECTOR_LOCK );
656- LockAcquire (& collectorTag , ExclusiveLock , false, false);
659+ LWLockAcquire (queue_lock , LW_EXCLUSIVE );
660+ LWLockAcquire (collector_lock , LW_EXCLUSIVE );
657661 recv_mq = shm_mq_create (pgws_collector_mq , COLLECTOR_QUEUE_SIZE );
658662 pgws_collector_hdr -> request = request ;
659- LockRelease ( & collectorTag , ExclusiveLock , false );
663+ LWLockRelease ( collector_lock );
660664
661665 /*
662666 * Check that the collector was started to avoid NULL
@@ -716,7 +720,7 @@ receive_array(SHMRequest request, Size item_size, Size *count)
716720
717721 /* We still have to detach and release lock during normal operation. */
718722 shm_mq_detach (recv_mqh );
719- LockRelease ( & queueTag , ExclusiveLock , false );
723+ LWLockRelease ( queue_lock );
720724
721725 return result ;
722726}
@@ -822,18 +826,12 @@ PG_FUNCTION_INFO_V1(pg_wait_sampling_reset_profile);
822826Datum
823827pg_wait_sampling_reset_profile (PG_FUNCTION_ARGS )
824828{
825- LOCKTAG collectorTag ;
826-
827829 check_shmem ();
828830
829- pgws_init_lock_tag (& queueTag , PGWS_QUEUE_LOCK );
830-
831- LockAcquire (& queueTag , ExclusiveLock , false, false);
832-
833- pgws_init_lock_tag (& collectorTag , PGWS_COLLECTOR_LOCK );
834- LockAcquire (& collectorTag , ExclusiveLock , false, false);
831+ LWLockAcquire (queue_lock , LW_EXCLUSIVE );
832+ LWLockAcquire (collector_lock , LW_EXCLUSIVE );
835833 pgws_collector_hdr -> request = PROFILE_RESET ;
836- LockRelease ( & collectorTag , ExclusiveLock , false );
834+ LWLockRelease ( collector_lock );
837835
838836 /*
839837 * Check that the collector was started to avoid NULL
@@ -845,7 +843,7 @@ pg_wait_sampling_reset_profile(PG_FUNCTION_ARGS)
845843
846844 SetLatch (pgws_collector_hdr -> latch );
847845
848- LockRelease ( & queueTag , ExclusiveLock , false );
846+ LWLockRelease ( queue_lock );
849847
850848 PG_RETURN_VOID ();
851849}
0 commit comments