diff options
author | Tom Lane | 2009-01-03 20:03:08 +0000 |
---|---|---|
committer | Tom Lane | 2009-01-03 20:03:08 +0000 |
commit | 4ad56ba2f9175e173253e9bac349a09092c58b21 (patch) | |
tree | 0c911b93e465e48c6e59fd25dd331c47e6cb9528 | |
parent | da47a3aa7da4cb9fb3e110a6262457572cdb86fe (diff) |
Allow loadable modules to create PGC_POSTMASTER GUC variables, but only
when loaded via shared_preload_libraries. Needed for support of
pg_stat_statements, or pretty much anything else that wants a GUC to
control size of a shared memory allocation.
-rw-r--r-- | src/backend/utils/init/miscinit.c | 5 | ||||
-rw-r--r-- | src/backend/utils/misc/guc.c | 21 | ||||
-rw-r--r-- | src/include/miscadmin.h | 1 |
3 files changed, 26 insertions, 1 deletions
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 3c1f00fef9..74b4078254 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -1131,6 +1131,9 @@ ValidatePgVersion(const char *path) char *shared_preload_libraries_string = NULL; char *local_preload_libraries_string = NULL; +/* Flag telling that we are loading shared_preload_libraries */ +bool process_shared_preload_libraries_in_progress = false; + /* * load the shared libraries listed in 'libraries' * @@ -1197,9 +1200,11 @@ load_libraries(const char *libraries, const char *gucname, bool restricted) void process_shared_preload_libraries(void) { + process_shared_preload_libraries_in_progress = true; load_libraries(shared_preload_libraries_string, "shared_preload_libraries", false); + process_shared_preload_libraries_in_progress = false; } /* diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 137077e104..b524c3c878 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -5625,6 +5625,17 @@ init_custom_variable(const char *name, { struct config_generic *gen; + /* + * Only allow custom PGC_POSTMASTER variables to be created during + * shared library preload; any later than that, we can't ensure that + * the value doesn't change after startup. This is a fatal elog if it + * happens; just erroring out isn't safe because we don't know what + * the calling loadable module might already have hooked into. + */ + if (context == PGC_POSTMASTER && + !process_shared_preload_libraries_in_progress) + elog(FATAL, "cannot create PGC_POSTMASTER variables after startup"); + gen = (struct config_generic *) guc_malloc(ERROR, sz); memset(gen, 0, sz); @@ -5707,7 +5718,15 @@ define_custom_variable(struct config_generic * variable) case PGC_S_ENV_VAR: case PGC_S_FILE: case PGC_S_ARGV: - phcontext = PGC_SIGHUP; + /* + * If we got past the check in init_custom_variable, we can + * safely assume that any existing value for a PGC_POSTMASTER + * variable was set in postmaster context. + */ + if (variable->context == PGC_POSTMASTER) + phcontext = PGC_POSTMASTER; + else + phcontext = PGC_SIGHUP; break; case PGC_S_DATABASE: case PGC_S_USER: diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 2b1382c0ab..9753d2f71c 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -328,6 +328,7 @@ extern void BaseInit(void); /* in utils/init/miscinit.c */ extern bool IgnoreSystemIndexes; +extern PGDLLIMPORT bool process_shared_preload_libraries_in_progress; extern char *shared_preload_libraries_string; extern char *local_preload_libraries_string; |