diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/Makefile | 4 | ||||
-rw-r--r-- | src/backend/storage/lmgr/.gitignore | 1 | ||||
-rw-r--r-- | src/backend/storage/lmgr/Makefile | 9 | ||||
-rw-r--r-- | src/backend/storage/lmgr/generate-lwlocknames.pl | 60 | ||||
-rw-r--r-- | src/backend/storage/lmgr/lwlock.c | 15 | ||||
-rw-r--r-- | src/backend/storage/lmgr/lwlocknames.txt | 60 | ||||
-rw-r--r-- | src/backend/storage/lmgr/meson.build | 2 | ||||
-rw-r--r-- | src/backend/utils/activity/wait_event_names.txt | 8 | ||||
-rw-r--r-- | src/include/storage/lwlock.h | 4 | ||||
-rw-r--r-- | src/include/storage/lwlocklist.h | 85 | ||||
-rw-r--r-- | src/include/storage/meson.build | 12 | ||||
-rwxr-xr-x | src/tools/pginclude/headerscheck | 1 |
12 files changed, 136 insertions, 125 deletions
diff --git a/src/backend/Makefile b/src/backend/Makefile index 3d7be095291..6700aec0396 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -110,8 +110,8 @@ $(top_builddir)/src/port/libpgport_srv.a: | submake-libpgport parser/gram.h: parser/gram.y $(MAKE) -C parser gram.h -storage/lmgr/lwlocknames.h: storage/lmgr/generate-lwlocknames.pl storage/lmgr/lwlocknames.txt utils/activity/wait_event_names.txt - $(MAKE) -C storage/lmgr lwlocknames.h lwlocknames.c +storage/lmgr/lwlocknames.h: storage/lmgr/generate-lwlocknames.pl ../include/storage/lwlocklist.h utils/activity/wait_event_names.txt + $(MAKE) -C storage/lmgr lwlocknames.h utils/activity/wait_event_types.h: utils/activity/generate-wait_event_types.pl utils/activity/wait_event_names.txt $(MAKE) -C utils/activity wait_event_types.h pgstat_wait_event.c wait_event_funcs_data.c diff --git a/src/backend/storage/lmgr/.gitignore b/src/backend/storage/lmgr/.gitignore index dab4c3f5806..8e5b734f152 100644 --- a/src/backend/storage/lmgr/.gitignore +++ b/src/backend/storage/lmgr/.gitignore @@ -1,3 +1,2 @@ -/lwlocknames.c /lwlocknames.h /s_lock_test diff --git a/src/backend/storage/lmgr/Makefile b/src/backend/storage/lmgr/Makefile index 1aef423384c..3f89548bde6 100644 --- a/src/backend/storage/lmgr/Makefile +++ b/src/backend/storage/lmgr/Makefile @@ -18,7 +18,6 @@ OBJS = \ lmgr.o \ lock.o \ lwlock.o \ - lwlocknames.o \ predicate.o \ proc.o \ s_lock.o \ @@ -35,11 +34,7 @@ s_lock_test: s_lock.c $(top_builddir)/src/common/libpgcommon.a $(top_builddir)/s $(TASPATH) -L $(top_builddir)/src/common -lpgcommon \ -L $(top_builddir)/src/port -lpgport -lm -o s_lock_test -# see notes in src/backend/parser/Makefile -lwlocknames.c: lwlocknames.h - touch $@ - -lwlocknames.h: $(top_srcdir)/src/backend/storage/lmgr/lwlocknames.txt $(top_srcdir)/src/backend/utils/activity/wait_event_names.txt generate-lwlocknames.pl +lwlocknames.h: ../../../include/storage/lwlocklist.h ../../utils/activity/wait_event_names.txt generate-lwlocknames.pl $(PERL) $(srcdir)/generate-lwlocknames.pl $^ check: s_lock_test @@ -47,4 +42,4 @@ check: s_lock_test clean: rm -f s_lock_test - rm -f lwlocknames.h lwlocknames.c + rm -f lwlocknames.h diff --git a/src/backend/storage/lmgr/generate-lwlocknames.pl b/src/backend/storage/lmgr/generate-lwlocknames.pl index 7b93ecf6c1e..eaddd9d3b97 100644 --- a/src/backend/storage/lmgr/generate-lwlocknames.pl +++ b/src/backend/storage/lmgr/generate-lwlocknames.pl @@ -1,6 +1,6 @@ #!/usr/bin/perl # -# Generate lwlocknames.h and lwlocknames.c from lwlocknames.txt +# Generate lwlocknames.h from lwlocklist.h # Copyright (c) 2000-2024, PostgreSQL Global Development Group use strict; @@ -14,26 +14,22 @@ my $continue = "\n"; GetOptions('outdir:s' => \$output_path); -open my $lwlocknames, '<', $ARGV[0] or die; +open my $lwlocklist, '<', $ARGV[0] or die; open my $wait_event_names, '<', $ARGV[1] or die; # Include PID in suffix in case parallel make runs this multiple times. my $htmp = "$output_path/lwlocknames.h.tmp$$"; -my $ctmp = "$output_path/lwlocknames.c.tmp$$"; open my $h, '>', $htmp or die "Could not open $htmp: $!"; -open my $c, '>', $ctmp or die "Could not open $ctmp: $!"; my $autogen = - "/* autogenerated from src/backend/storage/lmgr/lwlocknames.txt, do not edit */\n"; + "/* autogenerated from src/include/storage/lwlocklist.h, 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 "const char *const IndividualLWLockNames[] = {"; # # First, record the predefined LWLocks listed in wait_event_names.txt. We'll -# cross-check those with the ones in lwlocknames.txt. +# cross-check those with the ones in lwlocklist.h. # my @wait_event_lwlocks; my $record_lwlocks = 0; @@ -61,66 +57,70 @@ while (<$wait_event_names>) # Record the LWLock. (my $waiteventname, my $waitevendocsentence) = split(/\t/, $_); - push(@wait_event_lwlocks, $waiteventname . "Lock"); + push(@wait_event_lwlocks, $waiteventname); } +my $in_comment = 0; my $i = 0; -while (<$lwlocknames>) +while (<$lwlocklist>) { chomp; - # Skip comments - next if /^#/; + # Skip single-line C comments and empty lines + next if m{^\s*/\*.*\*/$}; next if /^\s*$/; - die "unable to parse lwlocknames.txt" - unless /^(\w+)\s+(\d+)$/; + # skip multiline C comments + if ($in_comment == 1) + { + $in_comment = 0 if m{\*/}; + next; + } + elsif (m{^\s*/\*}) + { + $in_comment = 1; + next; + } - (my $lockname, my $lockidx) = ($1, $2); + die "unable to parse lwlocklist.h line \"$_\"" + unless /^PG_LWLOCK\((\d+),\s+(\w+)\)$/; - my $trimmedlockname = $lockname; - $trimmedlockname =~ s/Lock$//; - die "lock names must end with 'Lock'" if $trimmedlockname eq $lockname; + (my $lockidx, my $lockname) = ($1, $2); - die "lwlocknames.txt not in order" if $lockidx < $lastlockidx; - die "lwlocknames.txt has duplicates" if $lockidx == $lastlockidx; + die "lwlocklist.h not in order" if $lockidx < $lastlockidx; + die "lwlocklist.h has duplicates" if $lockidx == $lastlockidx; - die "$lockname defined in lwlocknames.txt but missing from " + die "$lockname defined in lwlocklist.h but missing from " . "wait_event_names.txt" if $i >= scalar @wait_event_lwlocks; die "lists of predefined LWLocks do not match (first mismatch at " . "$wait_event_lwlocks[$i] in wait_event_names.txt and $lockname in " - . "lwlocknames.txt)" + . "lwlocklist.h)" if $wait_event_lwlocks[$i] ne $lockname; $i++; while ($lastlockidx < $lockidx - 1) { ++$lastlockidx; - printf $c "%s \"<unassigned:%d>\"", $continue, $lastlockidx; $continue = ",\n"; } - printf $c "%s \"%s\"", $continue, $trimmedlockname; $lastlockidx = $lockidx; $continue = ",\n"; - print $h "#define $lockname (&MainLWLockArray[$lockidx].lock)\n"; + print $h "#define ${lockname}Lock (&MainLWLockArray[$lockidx].lock)\n"; } die "$wait_event_lwlocks[$i] defined in wait_event_names.txt but missing from " - . "lwlocknames.txt" + . "lwlocklist.h" if $i < scalar @wait_event_lwlocks; -printf $c "\n};\n"; print $h "\n"; printf $h "#define NUM_INDIVIDUAL_LWLOCKS %s\n", $lastlockidx + 1; close $h; -close $c; rename($htmp, "$output_path/lwlocknames.h") || die "rename: $htmp to $output_path/lwlocknames.h: $!"; -rename($ctmp, "$output_path/lwlocknames.c") || die "rename: $ctmp: $!"; -close $lwlocknames; +close $lwlocklist; diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 30f3a09a4ce..83992725de3 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -112,8 +112,8 @@ StaticAssertDecl(LW_VAL_EXCLUSIVE > (uint32) MAX_BACKENDS, * There are three sorts of LWLock "tranches": * * 1. The individually-named locks defined in lwlocknames.h each have their - * own tranche. The names of these tranches appear in IndividualLWLockNames[] - * in lwlocknames.c. + * own tranche. We absorb the names of these tranches from there into + * BuiltinTrancheNames here. * * 2. There are some predefined tranches for built-in groups of locks. * These are listed in enum BuiltinTrancheIds in lwlock.h, and their names @@ -126,9 +126,10 @@ StaticAssertDecl(LW_VAL_EXCLUSIVE > (uint32) MAX_BACKENDS, * All these names are user-visible as wait event names, so choose with care * ... and do not forget to update the documentation's list of wait events. */ -extern const char *const IndividualLWLockNames[]; /* in lwlocknames.c */ - static const char *const BuiltinTrancheNames[] = { +#define PG_LWLOCK(id, lockname) [id] = CppAsString(lockname) "Lock", +#include "storage/lwlocklist.h" +#undef PG_LWLOCK [LWTRANCHE_XACT_BUFFER] = "XactBuffer", [LWTRANCHE_COMMITTS_BUFFER] = "CommitTsBuffer", [LWTRANCHE_SUBTRANS_BUFFER] = "SubtransBuffer", @@ -742,11 +743,7 @@ LWLockReportWaitEnd(void) static const char * GetLWTrancheName(uint16 trancheId) { - /* Individual LWLock? */ - if (trancheId < NUM_INDIVIDUAL_LWLOCKS) - return IndividualLWLockNames[trancheId]; - - /* Built-in tranche? */ + /* Built-in tranche or individual LWLock? */ if (trancheId < LWTRANCHE_FIRST_USER_DEFINED) return BuiltinTrancheNames[trancheId]; diff --git a/src/backend/storage/lmgr/lwlocknames.txt b/src/backend/storage/lmgr/lwlocknames.txt deleted file mode 100644 index 284d168f776..00000000000 --- a/src/backend/storage/lmgr/lwlocknames.txt +++ /dev/null @@ -1,60 +0,0 @@ -# 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. Also, do not forget to update the section -# WaitEventLWLock of src/backend/utils/activity/wait_event_names.txt. - -# 0 is available; was formerly BufFreelistLock -ShmemIndexLock 1 -OidGenLock 2 -XidGenLock 3 -ProcArrayLock 4 -SInvalReadLock 5 -SInvalWriteLock 6 -WALBufMappingLock 7 -WALWriteLock 8 -ControlFileLock 9 -# 10 was CheckpointLock -# 11 was XactSLRULock -# 12 was SubtransSLRULock -MultiXactGenLock 13 -# 14 was MultiXactOffsetSLRULock -# 15 was MultiXactMemberSLRULock -RelCacheInitLock 16 -CheckpointerCommLock 17 -TwoPhaseStateLock 18 -TablespaceCreateLock 19 -BtreeVacuumLock 20 -AddinShmemInitLock 21 -AutovacuumLock 22 -AutovacuumScheduleLock 23 -SyncScanLock 24 -RelationMappingLock 25 -#26 was NotifySLRULock -NotifyQueueLock 27 -SerializableXactHashLock 28 -SerializableFinishedListLock 29 -SerializablePredicateListLock 30 -# 31 was SerialSLRULock -SyncRepLock 32 -BackgroundWorkerLock 33 -DynamicSharedMemoryControlLock 34 -AutoFileLock 35 -ReplicationSlotAllocationLock 36 -ReplicationSlotControlLock 37 -#38 was CommitTsSLRULock -CommitTsLock 39 -ReplicationOriginLock 40 -MultiXactTruncationLock 41 -# 42 was OldSnapshotTimeMapLock -LogicalRepWorkerLock 43 -XactTruncationLock 44 -# 45 was XactTruncationLock until removal of BackendRandomLock -WrapLimitsVacuumLock 46 -NotifyQueueTailLock 47 -WaitEventExtensionLock 48 -WALSummarizerLock 49 -DSMRegistryLock 50 -InjectionPointLock 51 -SerialControlLock 52 diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build index da32198f788..05ac41e809a 100644 --- a/src/backend/storage/lmgr/meson.build +++ b/src/backend/storage/lmgr/meson.build @@ -11,5 +11,3 @@ backend_sources += files( 's_lock.c', 'spin.c', ) - -generated_backend_sources += lwlocknames[1] diff --git a/src/backend/utils/activity/wait_event_names.txt b/src/backend/utils/activity/wait_event_names.txt index c08e00d1d6a..8d0571a03d1 100644 --- a/src/backend/utils/activity/wait_event_names.txt +++ b/src/backend/utils/activity/wait_event_names.txt @@ -280,9 +280,9 @@ Extension "Waiting in an extension." # This class of wait events has its own set of C structure, so these are # only used for the documentation. # -# NB: Predefined LWLocks (i.e., those declared in lwlocknames.txt) must be +# NB: Predefined LWLocks (i.e., those declared in lwlocklist.h) must be # listed in the top section of locks and must be listed in the same order as in -# lwlocknames.txt. +# lwlocklist.h. # Section: ClassName - WaitEventLWLock @@ -333,9 +333,9 @@ SerialControl "Waiting to read or update shared <filename>pg_serial</filename> s # # END OF PREDEFINED LWLOCKS (DO NOT CHANGE THIS LINE) # -# Predefined LWLocks (i.e., those declared in lwlocknames.txt) must be listed +# Predefined LWLocks (i.e., those declared in lwlocknames.h) must be listed # in the section above and must be listed in the same order as in -# lwlocknames.txt. Other LWLocks must be listed in the section below. +# lwlocknames.h. Other LWLocks must be listed in the section below. # XactBuffer "Waiting for I/O on a transaction status SLRU buffer." diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h index 10bea8c5950..3479b4cf522 100644 --- a/src/include/storage/lwlock.h +++ b/src/include/storage/lwlock.h @@ -19,6 +19,7 @@ #endif #include "port/atomics.h" +#include "storage/lwlocknames.h" #include "storage/proclist_types.h" struct PGPROC; @@ -82,9 +83,6 @@ typedef struct NamedLWLockTranche extern PGDLLIMPORT NamedLWLockTranche *NamedLWLockTrancheArray; extern PGDLLIMPORT int NamedLWLockTrancheRequests; -/* Names for fixed lwlocks */ -#include "storage/lwlocknames.h" - /* * It's a bit odd to declare NUM_BUFFER_PARTITIONS and NUM_LOCK_PARTITIONS * here, but we need them to figure out offsets within MainLWLockArray, and diff --git a/src/include/storage/lwlocklist.h b/src/include/storage/lwlocklist.h new file mode 100644 index 00000000000..85f6568b9e4 --- /dev/null +++ b/src/include/storage/lwlocklist.h @@ -0,0 +1,85 @@ +/*------------------------------------------------------------------------- + * + * lwlocklist.h + * + * The predefined LWLock list is kept in its own source file for use by + * automatic tools. The exact representation of a keyword is determined by + * the PG_LWLOCK macro, which is not defined in this file; it can be + * defined by the caller for special purposes. + * + * Also, generate-lwlocknames.pl processes this file to create lwlocknames.h. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/include/storage/lwlocklist.h + * + *------------------------------------------------------------------------- + */ + +/* + * 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. Also, do not forget to update the section + * WaitEventLWLock of src/backend/utils/activity/wait_event_names.txt. + * + * Note that the names here don't include the Lock suffix, to appease the + * C preprocessor; it's added elsewhere. + */ + +/* 0 is available; was formerly BufFreelistLock */ +PG_LWLOCK(1, ShmemIndex) +PG_LWLOCK(2, OidGen) +PG_LWLOCK(3, XidGen) +PG_LWLOCK(4, ProcArray) +PG_LWLOCK(5, SInvalRead) +PG_LWLOCK(6, SInvalWrite) +PG_LWLOCK(7, WALBufMapping) +PG_LWLOCK(8, WALWrite) +PG_LWLOCK(9, ControlFile) +/* 10 was CheckpointLock */ +/* 11 was XactSLRULock */ +/* 12 was SubtransSLRULock */ +PG_LWLOCK(13, MultiXactGen) +/* 14 was MultiXactOffsetSLRULock */ +/* 15 was MultiXactMemberSLRULock */ +PG_LWLOCK(16, RelCacheInit) +PG_LWLOCK(17, CheckpointerComm) +PG_LWLOCK(18, TwoPhaseState) +PG_LWLOCK(19, TablespaceCreate) +PG_LWLOCK(20, BtreeVacuum) +PG_LWLOCK(21, AddinShmemInit) +PG_LWLOCK(22, Autovacuum) +PG_LWLOCK(23, AutovacuumSchedule) +PG_LWLOCK(24, SyncScan) +PG_LWLOCK(25, RelationMapping) +/* 26 was NotifySLRULock */ +PG_LWLOCK(27, NotifyQueue) +PG_LWLOCK(28, SerializableXactHash) +PG_LWLOCK(29, SerializableFinishedList) +PG_LWLOCK(30, SerializablePredicateList) +/* 31 was SerialSLRULock */ +PG_LWLOCK(32, SyncRep) +PG_LWLOCK(33, BackgroundWorker) +PG_LWLOCK(34, DynamicSharedMemoryControl) +PG_LWLOCK(35, AutoFile) +PG_LWLOCK(36, ReplicationSlotAllocation) +PG_LWLOCK(37, ReplicationSlotControl) +/* 38 was CommitTsSLRULock */ +PG_LWLOCK(39, CommitTs) +PG_LWLOCK(40, ReplicationOrigin) +PG_LWLOCK(41, MultiXactTruncation) +/* 42 was OldSnapshotTimeMapLock */ +PG_LWLOCK(43, LogicalRepWorker) +PG_LWLOCK(44, XactTruncation) +/* 45 was XactTruncationLock until removal of BackendRandomLock */ +PG_LWLOCK(46, WrapLimitsVacuum) +PG_LWLOCK(47, NotifyQueueTail) +PG_LWLOCK(48, WaitEventExtension) +PG_LWLOCK(49, WALSummarizer) +PG_LWLOCK(50, DSMRegistry) +PG_LWLOCK(51, InjectionPoint) +PG_LWLOCK(52, SerialControl) diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build index 666fb22408e..f889093117e 100644 --- a/src/include/storage/meson.build +++ b/src/include/storage/meson.build @@ -1,10 +1,10 @@ # Copyright (c) 2022-2024, PostgreSQL Global Development Group -lwlocknames = custom_target('lwlocknames', +lwlocknames_h = custom_target('lwlocknames_h', input: files( - '../../backend/storage/lmgr/lwlocknames.txt', + '../../include/storage/lwlocklist.h', '../../backend/utils/activity/wait_event_names.txt'), - output: ['lwlocknames.h', 'lwlocknames.c'], + output: ['lwlocknames.h'], command: [ perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'), '-o', '@OUTDIR@', @@ -12,12 +12,10 @@ lwlocknames = custom_target('lwlocknames', ], build_by_default: true, install: true, - install_dir: [dir_include_server / 'storage', false], + install_dir: dir_include_server / 'storage', ) -lwlocknames_h = lwlocknames[0] - generated_backend_headers += lwlocknames_h # autoconf generates the file there, ensure we get a conflict -generated_sources_ac += {'src/backend/storage/lmgr': ['lwlocknames.c', 'lwlocknames.h']} +generated_sources_ac += {'src/backend/storage/lmgr': ['lwlocknames.h']} diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck index a59be39307e..4a157d0a5f2 100755 --- a/src/tools/pginclude/headerscheck +++ b/src/tools/pginclude/headerscheck @@ -133,6 +133,7 @@ do test "$f" = src/interfaces/ecpg/preproc/c_kwlist.h && continue test "$f" = src/interfaces/ecpg/preproc/ecpg_kwlist.h && continue test "$f" = src/include/regex/regerrs.h && continue + test "$f" = src/include/storage/lwlocklist.h && continue test "$f" = src/include/tcop/cmdtaglist.h && continue test "$f" = src/pl/plpgsql/src/plerrcodes.h && continue test "$f" = src/pl/plpython/spiexceptions.h && continue |