aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2018-10-16 12:05:50 -0700
committerAndres Freund <andres@anarazel.de>2018-10-16 12:05:50 -0700
commit93ca02e00560ad6553fbd8ebabb7d5349e98ade8 (patch)
tree6f6a0e025e4c59ab3520f45fc2e4a79139aad36c
parentd1211c63f010c4e0c22d6070872e80b8c8b4df82 (diff)
downloadpostgresql-93ca02e00560ad6553fbd8ebabb7d5349e98ade8.tar.gz
postgresql-93ca02e00560ad6553fbd8ebabb7d5349e98ade8.zip
Mark constantly allocated dest receiver as const.
This allows the compiler / linker to mark affected pages as read-only. Doing so requires casting constness away, as CreateDestReceiver() returns both constant and non-constant dest receivers. That's fine though, as any modification of the statically allocated receivers would already have been a bug (and would now be caught on some platforms). Discussion: https://postgr.es/m/20181015200754.7y7zfuzsoux2c4ya@alap3.anarazel.de
-rw-r--r--src/backend/tcop/dest.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/src/backend/tcop/dest.c b/src/backend/tcop/dest.c
index c95a4d519de..4091ca9e4b9 100644
--- a/src/backend/tcop/dest.c
+++ b/src/backend/tcop/dest.c
@@ -67,29 +67,33 @@ donothingCleanup(DestReceiver *self)
* static DestReceiver structs for dest types needing no local state
* ----------------
*/
-static DestReceiver donothingDR = {
+static const DestReceiver donothingDR = {
donothingReceive, donothingStartup, donothingCleanup, donothingCleanup,
DestNone
};
-static DestReceiver debugtupDR = {
+static const DestReceiver debugtupDR = {
debugtup, debugStartup, donothingCleanup, donothingCleanup,
DestDebug
};
-static DestReceiver printsimpleDR = {
+static const DestReceiver printsimpleDR = {
printsimple, printsimple_startup, donothingCleanup, donothingCleanup,
DestRemoteSimple
};
-static DestReceiver spi_printtupDR = {
+static const DestReceiver spi_printtupDR = {
spi_printtup, spi_dest_startup, donothingCleanup, donothingCleanup,
DestSPI
};
-/* Globally available receiver for DestNone */
-DestReceiver *None_Receiver = &donothingDR;
-
+/*
+ * Globally available receiver for DestNone.
+ *
+ * It's ok to cast the constness away as any modification of the none receiver
+ * would be a bug (which gets easier to catch this way).
+ */
+DestReceiver *None_Receiver = (DestReceiver *) &donothingDR;
/* ----------------
* BeginCommand - initialize the destination at start of command
@@ -108,6 +112,11 @@ BeginCommand(const char *commandTag, CommandDest dest)
DestReceiver *
CreateDestReceiver(CommandDest dest)
{
+ /*
+ * It's ok to cast the constness away as any modification of the none receiver
+ * would be a bug (which gets easier to catch this way).
+ */
+
switch (dest)
{
case DestRemote:
@@ -115,16 +124,16 @@ CreateDestReceiver(CommandDest dest)
return printtup_create_DR(dest);
case DestRemoteSimple:
- return &printsimpleDR;
+ return unconstify(DestReceiver *, &printsimpleDR);
case DestNone:
- return &donothingDR;
+ return unconstify(DestReceiver *, &donothingDR);
case DestDebug:
- return &debugtupDR;
+ return unconstify(DestReceiver *, &debugtupDR);
case DestSPI:
- return &spi_printtupDR;
+ return unconstify(DestReceiver *, &spi_printtupDR);
case DestTuplestore:
return CreateTuplestoreDestReceiver();
@@ -146,7 +155,7 @@ CreateDestReceiver(CommandDest dest)
}
/* should never get here */
- return &donothingDR;
+ pg_unreachable();
}
/* ----------------