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