From 62dadff86dba4a13b3092ddd8bd58f58e6f5c70f Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 3 Oct 2025 08:27:18 +0200 Subject: [PATCH v1 3/8] Change reset_extra into a config_generic common field This is not specific to the GUC parameter type, so it can be part of the generic struct rather than the type-specific struct (like the related "extra" field). --- src/backend/utils/misc/guc.c | 115 +++++++++------------------------ src/include/utils/guc_tables.h | 6 +- 2 files changed, 32 insertions(+), 89 deletions(-) diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index dac09ae7853..d3c3179a053 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -743,29 +743,8 @@ extra_field_used(struct config_generic *gconf, void *extra) { if (extra == gconf->extra) return true; - switch (gconf->vartype) - { - case PGC_BOOL: - if (extra == ((struct config_bool *) gconf)->reset_extra) - return true; - break; - case PGC_INT: - if (extra == ((struct config_int *) gconf)->reset_extra) - return true; - break; - case PGC_REAL: - if (extra == ((struct config_real *) gconf)->reset_extra) - return true; - break; - case PGC_STRING: - if (extra == ((struct config_string *) gconf)->reset_extra) - return true; - break; - case PGC_ENUM: - if (extra == ((struct config_enum *) gconf)->reset_extra) - return true; - break; - } + if (extra == gconf->reset_extra) + return true; for (GucStack *stack = gconf->stack; stack; stack = stack->prev) { if (extra == stack->prior.extra || @@ -1634,6 +1613,8 @@ InitializeGUCOptionsFromEnvironment(void) static void InitializeOneGUCOption(struct config_generic *gconf) { + void *extra = NULL; + gconf->status = 0; gconf->source = PGC_S_DEFAULT; gconf->reset_source = PGC_S_DEFAULT; @@ -1653,7 +1634,6 @@ InitializeOneGUCOption(struct config_generic *gconf) { struct config_bool *conf = (struct config_bool *) gconf; bool newval = conf->boot_val; - void *extra = NULL; if (!call_bool_check_hook(conf, &newval, &extra, PGC_S_DEFAULT, LOG)) @@ -1662,14 +1642,12 @@ InitializeOneGUCOption(struct config_generic *gconf) if (conf->assign_hook) conf->assign_hook(newval, extra); *conf->variable = conf->reset_val = newval; - conf->gen.extra = conf->reset_extra = extra; break; } case PGC_INT: { struct config_int *conf = (struct config_int *) gconf; int newval = conf->boot_val; - void *extra = NULL; Assert(newval >= conf->min); Assert(newval <= conf->max); @@ -1680,14 +1658,12 @@ InitializeOneGUCOption(struct config_generic *gconf) if (conf->assign_hook) conf->assign_hook(newval, extra); *conf->variable = conf->reset_val = newval; - conf->gen.extra = conf->reset_extra = extra; break; } case PGC_REAL: { struct config_real *conf = (struct config_real *) gconf; double newval = conf->boot_val; - void *extra = NULL; Assert(newval >= conf->min); Assert(newval <= conf->max); @@ -1698,14 +1674,12 @@ InitializeOneGUCOption(struct config_generic *gconf) if (conf->assign_hook) conf->assign_hook(newval, extra); *conf->variable = conf->reset_val = newval; - conf->gen.extra = conf->reset_extra = extra; break; } case PGC_STRING: { struct config_string *conf = (struct config_string *) gconf; char *newval; - void *extra = NULL; /* non-NULL boot_val must always get strdup'd */ if (conf->boot_val != NULL) @@ -1720,14 +1694,12 @@ InitializeOneGUCOption(struct config_generic *gconf) if (conf->assign_hook) conf->assign_hook(newval, extra); *conf->variable = conf->reset_val = newval; - conf->gen.extra = conf->reset_extra = extra; break; } case PGC_ENUM: { struct config_enum *conf = (struct config_enum *) gconf; int newval = conf->boot_val; - void *extra = NULL; if (!call_enum_check_hook(conf, &newval, &extra, PGC_S_DEFAULT, LOG)) @@ -1736,10 +1708,11 @@ InitializeOneGUCOption(struct config_generic *gconf) if (conf->assign_hook) conf->assign_hook(newval, extra); *conf->variable = conf->reset_val = newval; - conf->gen.extra = conf->reset_extra = extra; break; } } + + gconf->extra = gconf->reset_extra = extra; } /* @@ -2027,10 +2000,10 @@ ResetAllOptions(void) if (conf->assign_hook) conf->assign_hook(conf->reset_val, - conf->reset_extra); + conf->gen.reset_extra); *conf->variable = conf->reset_val; set_extra_field(&conf->gen, &conf->gen.extra, - conf->reset_extra); + conf->gen.reset_extra); break; } case PGC_INT: @@ -2039,10 +2012,10 @@ ResetAllOptions(void) if (conf->assign_hook) conf->assign_hook(conf->reset_val, - conf->reset_extra); + conf->gen.reset_extra); *conf->variable = conf->reset_val; set_extra_field(&conf->gen, &conf->gen.extra, - conf->reset_extra); + conf->gen.reset_extra); break; } case PGC_REAL: @@ -2051,10 +2024,10 @@ ResetAllOptions(void) if (conf->assign_hook) conf->assign_hook(conf->reset_val, - conf->reset_extra); + conf->gen.reset_extra); *conf->variable = conf->reset_val; set_extra_field(&conf->gen, &conf->gen.extra, - conf->reset_extra); + conf->gen.reset_extra); break; } case PGC_STRING: @@ -2063,10 +2036,10 @@ ResetAllOptions(void) if (conf->assign_hook) conf->assign_hook(conf->reset_val, - conf->reset_extra); + conf->gen.reset_extra); set_string_field(conf, conf->variable, conf->reset_val); set_extra_field(&conf->gen, &conf->gen.extra, - conf->reset_extra); + conf->gen.reset_extra); break; } case PGC_ENUM: @@ -2075,10 +2048,10 @@ ResetAllOptions(void) if (conf->assign_hook) conf->assign_hook(conf->reset_val, - conf->reset_extra); + conf->gen.reset_extra); *conf->variable = conf->reset_val; set_extra_field(&conf->gen, &conf->gen.extra, - conf->reset_extra); + conf->gen.reset_extra); break; } } @@ -3712,7 +3685,7 @@ set_config_with_handle(const char *name, config_handle *handle, else { newval = conf->reset_val; - newextra = conf->reset_extra; + newextra = conf->gen.reset_extra; source = conf->gen.reset_source; context = conf->gen.reset_scontext; srole = conf->gen.reset_srole; @@ -3757,7 +3730,7 @@ set_config_with_handle(const char *name, config_handle *handle, if (conf->gen.reset_source <= source) { conf->reset_val = newval; - set_extra_field(&conf->gen, &conf->reset_extra, + set_extra_field(&conf->gen, &conf->gen.reset_extra, newextra); conf->gen.reset_source = source; conf->gen.reset_scontext = context; @@ -3808,7 +3781,7 @@ set_config_with_handle(const char *name, config_handle *handle, else { newval = conf->reset_val; - newextra = conf->reset_extra; + newextra = conf->gen.reset_extra; source = conf->gen.reset_source; context = conf->gen.reset_scontext; srole = conf->gen.reset_srole; @@ -3853,7 +3826,7 @@ set_config_with_handle(const char *name, config_handle *handle, if (conf->gen.reset_source <= source) { conf->reset_val = newval; - set_extra_field(&conf->gen, &conf->reset_extra, + set_extra_field(&conf->gen, &conf->gen.reset_extra, newextra); conf->gen.reset_source = source; conf->gen.reset_scontext = context; @@ -3904,7 +3877,7 @@ set_config_with_handle(const char *name, config_handle *handle, else { newval = conf->reset_val; - newextra = conf->reset_extra; + newextra = conf->gen.reset_extra; source = conf->gen.reset_source; context = conf->gen.reset_scontext; srole = conf->gen.reset_srole; @@ -3949,7 +3922,7 @@ set_config_with_handle(const char *name, config_handle *handle, if (conf->gen.reset_source <= source) { conf->reset_val = newval; - set_extra_field(&conf->gen, &conf->reset_extra, + set_extra_field(&conf->gen, &conf->gen.reset_extra, newextra); conf->gen.reset_source = source; conf->gen.reset_scontext = context; @@ -4019,7 +3992,7 @@ set_config_with_handle(const char *name, config_handle *handle, * guc.c's control */ newval = conf->reset_val; - newextra = conf->reset_extra; + newextra = conf->gen.reset_extra; source = conf->gen.reset_source; context = conf->gen.reset_scontext; srole = conf->gen.reset_srole; @@ -4113,7 +4086,7 @@ set_config_with_handle(const char *name, config_handle *handle, if (conf->gen.reset_source <= source) { set_string_field(conf, &conf->reset_val, newval); - set_extra_field(&conf->gen, &conf->reset_extra, + set_extra_field(&conf->gen, &conf->gen.reset_extra, newextra); conf->gen.reset_source = source; conf->gen.reset_scontext = context; @@ -4168,7 +4141,7 @@ set_config_with_handle(const char *name, config_handle *handle, else { newval = conf->reset_val; - newextra = conf->reset_extra; + newextra = conf->gen.reset_extra; source = conf->gen.reset_source; context = conf->gen.reset_scontext; srole = conf->gen.reset_srole; @@ -4213,7 +4186,7 @@ set_config_with_handle(const char *name, config_handle *handle, if (conf->gen.reset_source <= source) { conf->reset_val = newval; - set_extra_field(&conf->gen, &conf->reset_extra, + set_extra_field(&conf->gen, &conf->gen.reset_extra, newextra); conf->gen.reset_source = source; conf->gen.reset_scontext = context; @@ -6244,29 +6217,11 @@ RestoreGUCState(void *gucstate) switch (gconf->vartype) { case PGC_BOOL: - { - struct config_bool *conf = (struct config_bool *) gconf; - - if (conf->reset_extra && conf->reset_extra != gconf->extra) - guc_free(conf->reset_extra); - break; - } case PGC_INT: - { - struct config_int *conf = (struct config_int *) gconf; - - if (conf->reset_extra && conf->reset_extra != gconf->extra) - guc_free(conf->reset_extra); - break; - } case PGC_REAL: - { - struct config_real *conf = (struct config_real *) gconf; - - if (conf->reset_extra && conf->reset_extra != gconf->extra) - guc_free(conf->reset_extra); - break; - } + case PGC_ENUM: + /* no need to do anything */ + break; case PGC_STRING: { struct config_string *conf = (struct config_string *) gconf; @@ -6274,19 +6229,11 @@ RestoreGUCState(void *gucstate) guc_free(*conf->variable); if (conf->reset_val && conf->reset_val != *conf->variable) guc_free(conf->reset_val); - if (conf->reset_extra && conf->reset_extra != gconf->extra) - guc_free(conf->reset_extra); - break; - } - case PGC_ENUM: - { - struct config_enum *conf = (struct config_enum *) gconf; - - if (conf->reset_extra && conf->reset_extra != gconf->extra) - guc_free(conf->reset_extra); break; } } + if (gconf->reset_extra && gconf->reset_extra != gconf->extra) + guc_free(gconf->reset_extra); /* Remove it from any lists it's in. */ RemoveGUCFromLists(gconf); /* Now we can reset the struct to PGS_S_DEFAULT state. */ diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h index 44514691ba6..c5776be029b 100644 --- a/src/include/utils/guc_tables.h +++ b/src/include/utils/guc_tables.h @@ -188,6 +188,7 @@ struct config_generic Oid reset_srole; /* role that set the reset value */ GucStack *stack; /* stacked prior values */ void *extra; /* "extra" pointer for current actual value */ + void *reset_extra; dlist_node nondef_link; /* list link for variables that have source * different from PGC_S_DEFAULT */ slist_node stack_link; /* list link for variables that have non-NULL @@ -224,7 +225,6 @@ struct config_bool GucShowHook show_hook; /* variable fields, initialized at runtime: */ bool reset_val; - void *reset_extra; }; struct config_int @@ -240,7 +240,6 @@ struct config_int GucShowHook show_hook; /* variable fields, initialized at runtime: */ int reset_val; - void *reset_extra; }; struct config_real @@ -256,7 +255,6 @@ struct config_real GucShowHook show_hook; /* variable fields, initialized at runtime: */ double reset_val; - void *reset_extra; }; /* @@ -280,7 +278,6 @@ struct config_string GucShowHook show_hook; /* variable fields, initialized at runtime: */ char *reset_val; - void *reset_extra; }; struct config_enum @@ -295,7 +292,6 @@ struct config_enum GucShowHook show_hook; /* variable fields, initialized at runtime: */ int reset_val; - void *reset_extra; }; /* constant tables corresponding to enums above and in guc.h */ -- 2.51.0