diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 3766d8231ac..63378ab3d8c 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -363,6 +363,8 @@ BootstrapModeMain(int argc, char *argv[], bool check_only) SetProcessingMode(BootstrapProcessing); IgnoreSystemIndexes = true; + RegisterBuiltinShmemCallbacks(); + InitializeMaxBackends(); /* diff --git a/src/backend/postmaster/launch_backend.c b/src/backend/postmaster/launch_backend.c index 0973010b7dc..ed0f4f2d234 100644 --- a/src/backend/postmaster/launch_backend.c +++ b/src/backend/postmaster/launch_backend.c @@ -664,6 +664,8 @@ SubPostmasterMain(int argc, char *argv[]) */ LocalProcessControlFile(false); + RegisterBuiltinShmemCallbacks(); + /* * Reload any libraries that were preloaded by the postmaster. Since we * exec'd this process, those libraries didn't come along with us; but we diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 7a8ee19bdaf..a2de96a9a8e 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -922,6 +922,11 @@ PostmasterMain(int argc, char *argv[]) */ ApplyLauncherRegister(); + /* + * Register the shared memory needs of all core subsystems. + */ + RegisterBuiltinShmemCallbacks(); + /* * process any libraries that should be preloaded at postmaster start */ diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index 24422a80ab3..e4a6a52f12d 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -52,6 +52,7 @@ #include "storage/procsignal.h" #include "storage/shmem_internal.h" #include "storage/sinvaladt.h" +#include "storage/subsystems.h" #include "utils/guc.h" #include "utils/injection_point.h" #include "utils/wait_event.h" @@ -252,6 +253,26 @@ CreateSharedMemoryAndSemaphores(void) shmem_startup_hook(); } +/* + * Early initialization of various subsystems, giving them a chance to + * register their shared memory needs before the shared memory segment is + * allocated. + */ +void +RegisterBuiltinShmemCallbacks(void) +{ + /* + * Call RegisterShmemCallbacks(...) on each subsystem listed in + * subsystemslist.h + */ +#define PG_SHMEM_SUBSYSTEM(subsystem_callbacks) \ + RegisterShmemCallbacks(&(subsystem_callbacks)); + +#include "storage/subsystemlist.h" + +#undef PG_SHMEM_SUBSYSTEM +} + /* * Initialize various subsystems, setting up their data structures in * shared memory. diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c index e1724b0358d..51d974523d4 100644 --- a/src/backend/storage/ipc/shmem.c +++ b/src/backend/storage/ipc/shmem.c @@ -77,8 +77,10 @@ * ); * } * - * Register the callbacks by calling RegisterShmemCallbacks(&MyShmemCallbacks) - * in the extension's _PG_init() function. + * In builtin PostgreSQL code, add the callbacks to the list in + * src/include/storage/subsystemlist.h. In an add-in module, you can register + * the callbacks by calling RegisterShmemCallbacks(&MyShmemCallbacks) in the + * extension's _PG_init() function. * * Lifecycle * --------- diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 93851269e43..6a9ff3ad225 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -4138,6 +4138,9 @@ PostgresSingleUserMain(int argc, char *argv[], /* read control file (error checking and contains config ) */ LocalProcessControlFile(false); + /* Register the shared memory needs of all core subsystems. */ + RegisterBuiltinShmemCallbacks(); + /* * process any libraries that should be preloaded at postmaster start */ diff --git a/src/include/storage/ipc.h b/src/include/storage/ipc.h index da32787ab51..b205b00e7a1 100644 --- a/src/include/storage/ipc.h +++ b/src/include/storage/ipc.h @@ -77,6 +77,7 @@ extern void check_on_shmem_exit_lists_are_empty(void); /* ipci.c */ extern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook; +extern void RegisterBuiltinShmemCallbacks(void); extern Size CalculateShmemSize(void); extern void CreateSharedMemoryAndSemaphores(void); #ifdef EXEC_BACKEND diff --git a/src/include/storage/subsystemlist.h b/src/include/storage/subsystemlist.h new file mode 100644 index 00000000000..ed43c90bcc3 --- /dev/null +++ b/src/include/storage/subsystemlist.h @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------- + * subsystemlist.h + * + * List of initialization callbacks of built-in subsystems. This is kept in + * its own source file for possible use by automatic tools. + * PG_SHMEM_SUBSYSTEM is defined in the callers depending on how the list is + * used. + * + * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/storage/subsystemlist.h + *--------------------------------------------------------------------------- + */ + +/* there is deliberately not an #ifndef SUBSYSTEMLIST_H here */ + +/* + * Note: there are some inter-dependencies between these, so the order of some + * of these matter. + */ + +/* TODO: empty for now */ diff --git a/src/include/storage/subsystems.h b/src/include/storage/subsystems.h new file mode 100644 index 00000000000..38b735bec67 --- /dev/null +++ b/src/include/storage/subsystems.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------- + * + * subsystems.h + * Provide extern declarations for all the built-in subsystem callbacks + * + * + * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/storage/subsystems.h + * + *------------------------------------------------------------------------- + */ +#ifndef SUBSYSTEMS_H +#define SUBSYSTEMS_H + +#include "storage/shmem.h" + +/* + * Extern declarations of all the built-in subsystem callbacks + * + * The actual list is in subsystemlist.h, so that the same list can be used + * for other purposes. + */ +#define PG_SHMEM_SUBSYSTEM(callbacks) \ + extern const ShmemCallbacks callbacks; +#include "storage/subsystemlist.h" +#undef PG_SHMEM_SUBSYSTEM + +#endif /* SUBSYSTEMS_H */ diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck index 14c466cc237..24f7416185e 100755 --- a/src/tools/pginclude/headerscheck +++ b/src/tools/pginclude/headerscheck @@ -131,6 +131,7 @@ do test "$f" = src/include/postmaster/proctypelist.h && continue test "$f" = src/include/regex/regerrs.h && continue test "$f" = src/include/storage/lwlocklist.h && continue + test "$f" = src/include/storage/subsystemlist.h && continue test "$f" = src/include/tcop/cmdtaglist.h && continue test "$f" = src/interfaces/ecpg/preproc/c_kwlist.h && continue test "$f" = src/interfaces/ecpg/preproc/ecpg_kwlist.h && continue