v1-0003-Change-reset_extra-into-a-config_generic-common-f.patch
text/plain
Filename: v1-0003-Change-reset_extra-into-a-config_generic-common-f.patch
Type: text/plain
Part: 2
Message:
Reorganize GUC structs
Patch
Format: format-patch
Series: patch v1-0003
Subject: Change reset_extra into a config_generic common field
| File | + | − |
|---|---|---|
| src/backend/utils/misc/guc.c | 31 | 84 |
| src/include/utils/guc_tables.h | 1 | 5 |
From 62dadff86dba4a13b3092ddd8bd58f58e6f5c70f Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
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