@@ -60,10 +60,13 @@ shm_mq *pgws_collector_mq = NULL;
6060uint64 * pgws_proc_queryids = NULL ;
6161CollectorShmqHeader * pgws_collector_hdr = NULL ;
6262
63- /* Receiver (backend) local shm_mq pointers and lock */
63+ /* Receiver (backend) local shm_mq pointers */
6464static shm_mq * recv_mq = NULL ;
6565static shm_mq_handle * recv_mqh = NULL ;
66- static LOCKTAG queueTag ;
66+
67+ /* LWLock pointers */
68+ static LWLock * queue_lock ;
69+ LWLock * collector_lock ;
6770
6871/* Hook functions */
6972#if PG_VERSION_NUM >= 150000
@@ -239,6 +242,10 @@ pgws_shmem_request(void)
239242 prev_shmem_request_hook ();
240243
241244 RequestAddinShmemSpace (pgws_shmem_size ());
245+
246+ /* We request two different LWLock Tranches for ease of use */
247+ RequestNamedLWLockTranche (PGWS_QUEUE_LOCK_NAME , 1 );
248+ RequestNamedLWLockTranche (PGWS_COLLECTOR_LOCK_NAME , 1 );
242249}
243250#endif
244251
@@ -258,6 +265,9 @@ pgws_shmem_startup(void)
258265 if (!found )
259266 {
260267 /* Create shared objects */
268+ queue_lock = & (GetNamedLWLockTranche (PGWS_QUEUE_LOCK_NAME ))-> lock ;
269+ collector_lock = & (GetNamedLWLockTranche (PGWS_COLLECTOR_LOCK_NAME ))-> lock ;
270+
261271 toc = shm_toc_create (PG_WAIT_SAMPLING_MAGIC , pgws , segsize );
262272
263273 pgws_collector_hdr = shm_toc_allocate (toc , sizeof (CollectorShmqHeader ));
@@ -302,7 +312,7 @@ pgws_cleanup_callback(int code, Datum arg)
302312{
303313 elog (DEBUG3 , "pg_wait_sampling cleanup: detaching shm_mq and releasing queue lock" );
304314 shm_mq_detach (recv_mqh );
305- LockRelease ( & queueTag , ExclusiveLock , false );
315+ LWLockRelease ( queue_lock );
306316}
307317
308318/*
@@ -322,9 +332,13 @@ _PG_init(void)
322332 * resources in pgws_shmem_startup().
323333 *
324334 * If you change code here, don't forget to also report the modifications
325- * in pgsp_shmem_request () for pg15 and later.
335+ * in pgws_shmem_request () for pg15 and later.
326336 */
327337 RequestAddinShmemSpace (pgws_shmem_size ());
338+
339+ /* We request two different LWLock Tranches for ease of use */
340+ RequestNamedLWLockTranche (PGWS_QUEUE_LOCK_NAME , 1 );
341+ RequestNamedLWLockTranche (PGWS_COLLECTOR_LOCK_NAME , 1 );
328342#endif
329343
330344 pgws_register_wait_collector ();
@@ -619,22 +633,10 @@ typedef struct
619633 ProfileItem * items ;
620634} Profile ;
621635
622- void
623- pgws_init_lock_tag (LOCKTAG * tag , uint32 lock )
624- {
625- tag -> locktag_field1 = PG_WAIT_SAMPLING_MAGIC ;
626- tag -> locktag_field2 = lock ;
627- tag -> locktag_field3 = 0 ;
628- tag -> locktag_field4 = 0 ;
629- tag -> locktag_type = LOCKTAG_USERLOCK ;
630- tag -> locktag_lockmethodid = USER_LOCKMETHOD ;
631- }
632-
633636/* Get array (history or profile data) from shared memory */
634637static void *
635638receive_array (SHMRequest request , Size item_size , Size * count )
636639{
637- LOCKTAG collectorTag ;
638640 shm_mq_result res ;
639641 Size len ,
640642 i ;
@@ -644,14 +646,11 @@ receive_array(SHMRequest request, Size item_size, Size *count)
644646 MemoryContext oldctx ;
645647
646648 /* Ensure nobody else trying to send request to queue */
647- pgws_init_lock_tag (& queueTag , PGWS_QUEUE_LOCK );
648- LockAcquire (& queueTag , ExclusiveLock , false, false);
649-
650- pgws_init_lock_tag (& collectorTag , PGWS_COLLECTOR_LOCK );
651- LockAcquire (& collectorTag , ExclusiveLock , false, false);
649+ LWLockAcquire (queue_lock , LW_EXCLUSIVE );
650+ LWLockAcquire (collector_lock , LW_EXCLUSIVE );
652651 recv_mq = shm_mq_create (pgws_collector_mq , COLLECTOR_QUEUE_SIZE );
653652 pgws_collector_hdr -> request = request ;
654- LockRelease ( & collectorTag , ExclusiveLock , false );
653+ LWLockRelease ( collector_lock );
655654
656655 /*
657656 * Check that the collector was started to avoid NULL
@@ -711,7 +710,7 @@ receive_array(SHMRequest request, Size item_size, Size *count)
711710
712711 /* We still have to detach and release lock during normal operation. */
713712 shm_mq_detach (recv_mqh );
714- LockRelease ( & queueTag , ExclusiveLock , false );
713+ LWLockRelease ( queue_lock );
715714
716715 return result ;
717716}
@@ -814,18 +813,12 @@ PG_FUNCTION_INFO_V1(pg_wait_sampling_reset_profile);
814813Datum
815814pg_wait_sampling_reset_profile (PG_FUNCTION_ARGS )
816815{
817- LOCKTAG collectorTag ;
818-
819816 check_shmem ();
820817
821- pgws_init_lock_tag (& queueTag , PGWS_QUEUE_LOCK );
822-
823- LockAcquire (& queueTag , ExclusiveLock , false, false);
824-
825- pgws_init_lock_tag (& collectorTag , PGWS_COLLECTOR_LOCK );
826- LockAcquire (& collectorTag , ExclusiveLock , false, false);
818+ LWLockAcquire (queue_lock , LW_EXCLUSIVE );
819+ LWLockAcquire (collector_lock , LW_EXCLUSIVE );
827820 pgws_collector_hdr -> request = PROFILE_RESET ;
828- LockRelease ( & collectorTag , ExclusiveLock , false );
821+ LWLockRelease ( collector_lock );
829822
830823 /*
831824 * Check that the collector was started to avoid NULL
@@ -837,7 +830,7 @@ pg_wait_sampling_reset_profile(PG_FUNCTION_ARGS)
837830
838831 SetLatch (pgws_collector_hdr -> latch );
839832
840- LockRelease ( & queueTag , ExclusiveLock , false );
833+ LWLockRelease ( queue_lock );
841834
842835 PG_RETURN_VOID ();
843836}
0 commit comments