mirror of
https://github.com/postgres/postgres.git
synced 2025-11-15 03:41:20 +03:00
When LWLOCK_STATS is defined, count spindelays.
When LWLOCK_STATS is *not* defined, the only change is that SpinLockAcquire now returns the number of delays. Patch by me, review by Jeff Janes.
This commit is contained in:
@@ -95,6 +95,7 @@ static int counts_for_pid = 0;
|
||||
static int *sh_acquire_counts;
|
||||
static int *ex_acquire_counts;
|
||||
static int *block_counts;
|
||||
static int *spin_delay_counts;
|
||||
#endif
|
||||
|
||||
#ifdef LOCK_DEBUG
|
||||
@@ -134,6 +135,7 @@ init_lwlock_stats(void)
|
||||
|
||||
sh_acquire_counts = calloc(numLocks, sizeof(int));
|
||||
ex_acquire_counts = calloc(numLocks, sizeof(int));
|
||||
spin_delay_counts = calloc(numLocks, sizeof(int));
|
||||
block_counts = calloc(numLocks, sizeof(int));
|
||||
counts_for_pid = MyProcPid;
|
||||
on_shmem_exit(print_lwlock_stats, 0);
|
||||
@@ -151,10 +153,10 @@ print_lwlock_stats(int code, Datum arg)
|
||||
|
||||
for (i = 0; i < numLocks; i++)
|
||||
{
|
||||
if (sh_acquire_counts[i] || ex_acquire_counts[i] || block_counts[i])
|
||||
fprintf(stderr, "PID %d lwlock %d: shacq %u exacq %u blk %u\n",
|
||||
if (sh_acquire_counts[i] || ex_acquire_counts[i] || block_counts[i] || spin_delay_counts[i])
|
||||
fprintf(stderr, "PID %d lwlock %d: shacq %u exacq %u blk %u spindelay %u\n",
|
||||
MyProcPid, i, sh_acquire_counts[i], ex_acquire_counts[i],
|
||||
block_counts[i]);
|
||||
block_counts[i], spin_delay_counts[i]);
|
||||
}
|
||||
|
||||
LWLockRelease(0);
|
||||
@@ -395,7 +397,11 @@ LWLockAcquire(LWLockId lockid, LWLockMode mode)
|
||||
bool mustwait;
|
||||
|
||||
/* Acquire mutex. Time spent holding mutex should be short! */
|
||||
#ifdef LWLOCK_STATS
|
||||
spin_delay_counts[lockid] += SpinLockAcquire(&lock->mutex);
|
||||
#else
|
||||
SpinLockAcquire(&lock->mutex);
|
||||
#endif
|
||||
|
||||
/* If retrying, allow LWLockRelease to release waiters again */
|
||||
if (retry)
|
||||
|
||||
@@ -46,7 +46,7 @@ s_lock_stuck(volatile slock_t *lock, const char *file, int line)
|
||||
/*
|
||||
* s_lock(lock) - platform-independent portion of waiting for a spinlock.
|
||||
*/
|
||||
void
|
||||
int
|
||||
s_lock(volatile slock_t *lock, const char *file, int line)
|
||||
{
|
||||
/*
|
||||
@@ -155,6 +155,7 @@ s_lock(volatile slock_t *lock, const char *file, int line)
|
||||
if (spins_per_delay > MIN_SPINS_PER_DELAY)
|
||||
spins_per_delay = Max(spins_per_delay - 1, MIN_SPINS_PER_DELAY);
|
||||
}
|
||||
return delays;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user