Skip to content

Commit 89dda55

Browse files
committed
Store LWLock pointers in a separate stucture in shmem
Make saving LWLock pointers more like it is done in pg_stat_statements and other extensions that are pg_stat_statements-like This is done so pg_wait_sampling works correctly on Windows and EXEC_BACKEND builds
1 parent fc5c06e commit 89dda55

File tree

3 files changed

+29
-19
lines changed

3 files changed

+29
-19
lines changed

collector.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ pgws_collector_main(Datum main_arg)
428428
{
429429
SHMRequest request;
430430

431-
LWLockAcquire(collector_lock, LW_EXCLUSIVE);
431+
LWLockAcquire(pgws_lss->collector_lock, LW_EXCLUSIVE);
432432

433433
request = pgws_collector_hdr->request;
434434
pgws_collector_hdr->request = NO_REQUEST;
@@ -473,7 +473,7 @@ pgws_collector_main(Datum main_arg)
473473
hash_destroy(profile_hash);
474474
profile_hash = make_profile_hash();
475475
}
476-
LWLockRelease(collector_lock);
476+
LWLockRelease(pgws_lss->collector_lock);
477477
}
478478
}
479479

pg_wait_sampling.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ static shm_mq *recv_mq = NULL;
6868
static 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)
258257
static void
259258
pgws_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
}

pg_wait_sampling.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
#include "datatype/timestamp.h"
1414
#include "storage/latch.h"
15-
#include "storage/lock.h"
1615
#include "storage/lwlock.h"
1716
#include "storage/shm_mq.h"
1817

@@ -60,6 +59,13 @@ typedef struct
6059
SHMRequest request;
6160
} CollectorShmqHeader;
6261

62+
/* LWLock pointers */
63+
typedef struct pgwsLockSharedState
64+
{
65+
LWLock *queue_lock;
66+
LWLock *collector_lock;
67+
} pgwsLockSharedState;
68+
6369
/* GUC variables */
6470
extern int pgws_historySize;
6571
extern int pgws_historyPeriod;
@@ -73,7 +79,7 @@ extern shm_mq *pgws_collector_mq;
7379
extern uint64 *pgws_proc_queryids;
7480
extern CollectorShmqHeader *pgws_collector_hdr;
7581

76-
extern LWLock *collector_lock;
82+
extern pgwsLockSharedState *pgws_lss;
7783

7884
extern bool pgws_should_sample_proc(PGPROC *proc, int *pid_p, uint32 *wait_event_info_p);
7985

0 commit comments

Comments
 (0)