diff options
Diffstat (limited to 'src/backend')
| -rw-r--r-- | src/backend/Makefile | 14 | ||||
| -rw-r--r-- | src/backend/storage/lmgr/.gitignore | 2 | ||||
| -rw-r--r-- | src/backend/storage/lmgr/Makefile | 11 | ||||
| -rw-r--r-- | src/backend/storage/lmgr/generate-lwlocknames.pl | 67 | ||||
| -rw-r--r-- | src/backend/storage/lmgr/lwlock.c | 60 | ||||
| -rw-r--r-- | src/backend/storage/lmgr/lwlocknames.txt | 47 |
6 files changed, 182 insertions, 19 deletions
diff --git a/src/backend/Makefile b/src/backend/Makefile index 98b978f3da..f872deb188 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -106,7 +106,7 @@ endif endif # aix # Update the commonly used headers before building the subdirectories -$(SUBDIRS:%=%-recursive): $(top_builddir)/src/include/parser/gram.h $(top_builddir)/src/include/catalog/schemapg.h $(top_builddir)/src/include/utils/fmgroids.h $(top_builddir)/src/include/utils/errcodes.h $(top_builddir)/src/include/utils/probes.h +$(SUBDIRS:%=%-recursive): $(top_builddir)/src/include/parser/gram.h $(top_builddir)/src/include/catalog/schemapg.h $(top_builddir)/src/include/storage/lwlocknames.h $(top_builddir)/src/include/utils/fmgroids.h $(top_builddir)/src/include/utils/errcodes.h $(top_builddir)/src/include/utils/probes.h # run this unconditionally to avoid needing to know its dependencies here: submake-schemapg: @@ -135,6 +135,9 @@ postgres.o: $(OBJS) parser/gram.h: parser/gram.y $(MAKE) -C parser gram.h +storage/lmgr/lwlocknames.h: storage/lmgr/generate-lwlocknames.pl storage/lmgr/lwlocknames.txt + $(MAKE) -C storage/lmgr lwlocknames.h + utils/fmgroids.h: utils/Gen_fmgrtab.pl catalog/Catalog.pm $(top_srcdir)/src/include/catalog/pg_proc.h $(MAKE) -C utils fmgroids.h @@ -165,6 +168,11 @@ $(top_builddir)/src/include/catalog/schemapg.h: catalog/schemapg.h cd '$(dir $@)' && rm -f $(notdir $@) && \ $(LN_S) "$$prereqdir/$(notdir $<)" . +$(top_builddir)/src/include/storage/lwlocknames.h: storage/lmgr/lwlocknames.h + prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \ + cd '$(dir $@)' && rm -f $(notdir $@) && \ + $(LN_S) "$$prereqdir/$(notdir $<)" . + $(top_builddir)/src/include/utils/errcodes.h: utils/errcodes.h prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \ cd '$(dir $@)' && rm -f $(notdir $@) && \ @@ -192,6 +200,7 @@ distprep: $(MAKE) -C bootstrap bootparse.c bootscanner.c $(MAKE) -C catalog schemapg.h postgres.bki postgres.description postgres.shdescription $(MAKE) -C replication repl_gram.c repl_scanner.c + $(MAKE) -C storage lwlocknames.h $(MAKE) -C utils fmgrtab.c fmgroids.h errcodes.h $(MAKE) -C utils/misc guc-file.c $(MAKE) -C utils/sort qsort_tuple.c @@ -282,6 +291,7 @@ clean: rm -f $(LOCALOBJS) postgres$(X) $(POSTGRES_IMP) \ $(top_builddir)/src/include/parser/gram.h \ $(top_builddir)/src/include/catalog/schemapg.h \ + $(top_builddir)/src/include/storage/lwlocknames.h \ $(top_builddir)/src/include/utils/fmgroids.h \ $(top_builddir)/src/include/utils/probes.h ifeq ($(PORTNAME), cygwin) @@ -307,6 +317,8 @@ maintainer-clean: distclean catalog/postgres.shdescription \ replication/repl_gram.c \ replication/repl_scanner.c \ + storage/lmgr/lwlocknames.c \ + storage/lmgr/lwlocknames.h \ utils/fmgroids.h \ utils/fmgrtab.c \ utils/errcodes.h \ diff --git a/src/backend/storage/lmgr/.gitignore b/src/backend/storage/lmgr/.gitignore new file mode 100644 index 0000000000..9355caea8c --- /dev/null +++ b/src/backend/storage/lmgr/.gitignore @@ -0,0 +1,2 @@ +/lwlocknames.c +/lwlocknames.h diff --git a/src/backend/storage/lmgr/Makefile b/src/backend/storage/lmgr/Makefile index e12a8549f7..3ad7535d74 100644 --- a/src/backend/storage/lmgr/Makefile +++ b/src/backend/storage/lmgr/Makefile @@ -24,8 +24,17 @@ s_lock_test: s_lock.c $(top_builddir)/src/port/libpgport.a $(CC) $(CPPFLAGS) $(CFLAGS) -DS_LOCK_TEST=1 $(srcdir)/s_lock.c \ $(TASPATH) -L $(top_builddir)/src/port -lpgport -o s_lock_test +# see explanation in ../../parser/Makefile +lwlocknames.c: lwlocknames.h ; + +lwlocknames.h: $(top_srcdir)/src/backend/storage/lmgr/lwlocknames.txt generate-lwlocknames.pl + $(PERL) $(srcdir)/generate-lwlocknames.pl $< + check: s_lock_test ./s_lock_test -clean distclean maintainer-clean: +clean distclean: rm -f s_lock_test + +maintainer-clean: clean + rm -f lwlocknames.h lwlocknames.c diff --git a/src/backend/storage/lmgr/generate-lwlocknames.pl b/src/backend/storage/lmgr/generate-lwlocknames.pl new file mode 100644 index 0000000000..3af2347c2c --- /dev/null +++ b/src/backend/storage/lmgr/generate-lwlocknames.pl @@ -0,0 +1,67 @@ +#!/usr/bin/perl +# +# Generate lwlocknames.h and lwlocknames.c from lwlocknames.txt +# Copyright (c) 2000-2015, PostgreSQL Global Development Group + +use warnings; +use strict; + +my $lastlockidx = -1; +my $continue = "\n"; + +open my $lwlocknames, $ARGV[0] or die; + +# Include PID in suffix in case parallel make runs this multiple times. +my $htmp = "lwlocknames.h.tmp$$"; +my $ctmp = "lwlocknames.c.tmp$$"; +open H, '>', $htmp or die "Could not open $htmp: $!"; +open C, '>', $ctmp or die "Could not open $ctmp: $!"; + +my $autogen = + "/* autogenerated from src/backend/storage/lmgr/lwlocknames.txt, do not edit */\n"; +print H $autogen; +print H "/* there is deliberately not an #ifndef LWLOCKNAMES_H here */\n\n"; +print C $autogen, "\n"; + +print C "static char *MainLWLockNames[] = {"; + +while (<$lwlocknames>) +{ + chomp; + + # Skip comments + next if /^#/; + next if /^\s*$/; + + die "unable to parse lwlocknames.txt" + unless /^(\w+)\s+(\d+)$/; + + (my $lockname, my $lockidx) = ($1, $2); + + die "lwlocknames.txt not in order" if $lockidx < $lastlockidx; + die "lwlocknames.txt has duplicates" if $lockidx == $lastlockidx; + + while ($lastlockidx < $lockidx - 1) + { + ++$lastlockidx; + printf C "%s \"<unassigned:%d>\"", $continue, $lastlockidx; + $continue = ",\n"; + } + printf C "%s \"%s\"", $continue, $lockname; + $lastlockidx = $lockidx; + $continue = ",\n"; + + print H "#define $lockname (&MainLWLockArray[$lockidx].lock)\n"; +} + +printf C "\n};\n"; +print H "\n"; +printf H "#define NUM_INDIVIDUAL_LWLOCKS %s\n", $lastlockidx + 1; + +close H; +close C; + +rename($htmp, 'lwlocknames.h') || die "rename: $htmp: $!"; +rename($ctmp, 'lwlocknames.c') || die "rename: $ctmp: $!"; + +close $lwlocknames; diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 687ed6399c..db10a96123 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -95,6 +95,9 @@ #include "utils/hsearch.h" #endif +/* Constants for lwlock names */ +#include "lwlocknames.c" + /* We use the ShmemLock spinlock to protect LWLockAssign */ extern slock_t *ShmemLock; @@ -183,18 +186,32 @@ PRINT_LWDEBUG(const char *where, LWLock *lock, LWLockMode mode) if (Trace_lwlocks) { uint32 state = pg_atomic_read_u32(&lock->state); - - ereport(LOG, - (errhidestmt(true), - errhidecontext(true), - errmsg("%d: %s(%s %d): excl %u shared %u haswaiters %u waiters %u rOK %d", - MyProcPid, - where, T_NAME(lock), T_ID(lock), - !!(state & LW_VAL_EXCLUSIVE), - state & LW_SHARED_MASK, - !!(state & LW_FLAG_HAS_WAITERS), - pg_atomic_read_u32(&lock->nwaiters), - !!(state & LW_FLAG_RELEASE_OK)))); + int id = T_ID(lock); + + if (lock->tranche == 0 && id < NUM_INDIVIDUAL_LWLOCKS) + ereport(LOG, + (errhidestmt(true), + errhidecontext(true), + errmsg("%d: %s(%s): excl %u shared %u haswaiters %u waiters %u rOK %d", + MyProcPid, + where, MainLWLockNames[id], + !!(state & LW_VAL_EXCLUSIVE), + state & LW_SHARED_MASK, + !!(state & LW_FLAG_HAS_WAITERS), + pg_atomic_read_u32(&lock->nwaiters), + !!(state & LW_FLAG_RELEASE_OK)))); + else + ereport(LOG, + (errhidestmt(true), + errhidecontext(true), + errmsg("%d: %s(%s %d): excl %u shared %u haswaiters %u waiters %u rOK %d", + MyProcPid, + where, T_NAME(lock), id, + !!(state & LW_VAL_EXCLUSIVE), + state & LW_SHARED_MASK, + !!(state & LW_FLAG_HAS_WAITERS), + pg_atomic_read_u32(&lock->nwaiters), + !!(state & LW_FLAG_RELEASE_OK)))); } } @@ -204,11 +221,20 @@ LOG_LWDEBUG(const char *where, LWLock *lock, const char *msg) /* hide statement & context here, otherwise the log is just too verbose */ if (Trace_lwlocks) { - ereport(LOG, - (errhidestmt(true), - errhidecontext(true), - errmsg("%s(%s %d): %s", where, - T_NAME(lock), T_ID(lock), msg))); + int id = T_ID(lock); + + if (lock->tranche == 0 && id < NUM_INDIVIDUAL_LWLOCKS) + ereport(LOG, + (errhidestmt(true), + errhidecontext(true), + errmsg("%s(%s): %s", where, + MainLWLockNames[id], msg))); + else + ereport(LOG, + (errhidestmt(true), + errhidecontext(true), + errmsg("%s(%s %d): %s", where, + T_NAME(lock), id, msg))); } } diff --git a/src/backend/storage/lmgr/lwlocknames.txt b/src/backend/storage/lmgr/lwlocknames.txt new file mode 100644 index 0000000000..96bbfe8fab --- /dev/null +++ b/src/backend/storage/lmgr/lwlocknames.txt @@ -0,0 +1,47 @@ +# Some commonly-used locks have predefined positions within MainLWLockArray; +# these are defined here. If you add a lock, add it to the end to avoid +# renumbering the existing locks; if you remove a lock, consider leaving a gap +# in the numbering sequence for the benefit of DTrace and other external +# debugging scripts. + +# 0 is available; was formerly BufFreelistLock +ShmemIndexLock 1 +OidGenLock 2 +XidGenLock 3 +ProcArrayLock 4 +SInvalReadLock 5 +SInvalWriteLock 6 +WALBufMappingLock 7 +WALWriteLock 8 +ControlFileLock 9 +CheckpointLock 10 +CLogControlLock 11 +SubtransControlLock 12 +MultiXactGenLock 13 +MultiXactOffsetControlLock 14 +MultiXactMemberControlLock 15 +RelCacheInitLock 16 +CheckpointerCommLock 17 +TwoPhaseStateLock 18 +TablespaceCreateLock 19 +BtreeVacuumLock 20 +AddinShmemInitLock 21 +AutovacuumLock 22 +AutovacuumScheduleLock 23 +SyncScanLock 24 +RelationMappingLock 25 +AsyncCtlLock 26 +AsyncQueueLock 27 +SerializableXactHashLock 28 +SerializableFinishedListLock 29 +SerializablePredicateLockListLock 30 +OldSerXidLock 31 +SyncRepLock 32 +BackgroundWorkerLock 33 +DynamicSharedMemoryControlLock 34 +AutoFileLock 35 +ReplicationSlotAllocationLock 36 +ReplicationSlotControlLock 37 +CommitTsControlLock 38 +CommitTsLock 39 +ReplicationOriginLock 40 |
