diff options
author | Andres Freund <andres@anarazel.de> | 2018-10-16 12:05:50 -0700 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2018-10-16 12:05:50 -0700 |
commit | 93ca02e00560ad6553fbd8ebabb7d5349e98ade8 (patch) | |
tree | 6f6a0e025e4c59ab3520f45fc2e4a79139aad36c | |
parent | d1211c63f010c4e0c22d6070872e80b8c8b4df82 (diff) | |
download | postgresql-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.c | 33 |
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(); } /* ---------------- |