Re: Minor refactorings to eliminate some static buffers - Mailing list pgsql-hackers
From | Andres Freund |
---|---|
Subject | Re: Minor refactorings to eliminate some static buffers |
Date | |
Msg-id | 5uv3flphuupifemyh422nv2kptilmojbxc3iva2tlf2bagmpja@2mucopykh3mw Whole thread Raw |
In response to | Re: Minor refactorings to eliminate some static buffers (Heikki Linnakangas <hlinnaka@iki.fi>) |
Responses |
Re: Minor refactorings to eliminate some static buffers
|
List | pgsql-hackers |
Hi, On 2024-08-06 18:13:56 +0300, Heikki Linnakangas wrote: > From 6dd5a4a413212a61d9a4f5b9db73e812c8b5dcbd Mon Sep 17 00:00:00 2001 > From: Heikki Linnakangas <heikki.linnakangas@iki.fi> > Date: Tue, 6 Aug 2024 17:58:29 +0300 > Subject: [PATCH 1/5] Turn a few 'validnsps' static variables into locals > > There was no need for these to be static buffers, a local variable > works just as well. I think they were marked as 'static' to imply that > they are read-only, but 'const' is more appropriate for that, so > change them to const. I looked at these at some point in the past. Unfortunately compilers don't always generate better code with const than static :( (the static initialization can be done once in a global var, the const one not necessarily). Arguably what you'd want here is both. I doubt that matters here though. > diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c > index 702a6c3a0b..2732d6bfc9 100644 > --- a/src/backend/tcop/utility.c > +++ b/src/backend/tcop/utility.c > @@ -1155,7 +1155,7 @@ ProcessUtilitySlow(ParseState *pstate, > { > CreateStmt *cstmt = (CreateStmt *) stmt; > Datum toast_options; > - static char *validnsps[] = HEAP_RELOPT_NAMESPACES; > + const char *validnsps[] = HEAP_RELOPT_NAMESPACES; > > /* Remember transformed RangeVar for LIKE */ > table_rv = cstmt->relation; In the other places you used "const char * const", here just "const char *" - it doesn't look like that's a required difference? > From f108ae4c2ddfa6ca77e9736dc3fb20e6bda7b67c Mon Sep 17 00:00:00 2001 > From: Heikki Linnakangas <heikki.linnakangas@iki.fi> > Date: Tue, 6 Aug 2024 17:59:33 +0300 > Subject: [PATCH 2/5] Make nullSemAction const, add 'const' decorators to > related functions > To make it more clear that these should never be modified. Yep - and it reduces the size of writable mappings to boot. LGTM. > From da6f101b0ecc2d4e4b33bbcae316dbaf72e67d14 Mon Sep 17 00:00:00 2001 > From: Heikki Linnakangas <heikki.linnakangas@iki.fi> > Date: Tue, 6 Aug 2024 17:59:45 +0300 > Subject: [PATCH 3/5] Mark misc static global variables as const LGTM > From 5d562f15aaba0bb082e714e844995705f0ca1368 Mon Sep 17 00:00:00 2001 > From: Heikki Linnakangas <heikki.linnakangas@iki.fi> > Date: Tue, 6 Aug 2024 17:59:52 +0300 > Subject: [PATCH 4/5] Constify fields and parameters in spell.c > > I started by marking VoidString as const, and fixing the fallout by > marking more fields and function arguments as const. It proliferated > quite a lot, but all within spell.c and spell.h. > > A more narrow patch to get rid of the static VoidString buffer would > be to replace it with '#define VoidString ""', as C99 allows assigning > "" to a non-const pointer, even though you're not allowed to modify > it. But it seems like good hygiene to mark all these as const. In the > structs, the pointers can point to the constant VoidString, or a > buffer allocated with palloc(), or with compact_palloc(), so you > should not modify them. Looks reasonable to me. > From bb66efccf4f97d0001b730a1376845c0a19c7f27 Mon Sep 17 00:00:00 2001 > From: Heikki Linnakangas <heikki.linnakangas@iki.fi> > Date: Tue, 6 Aug 2024 18:00:01 +0300 > Subject: [PATCH 5/5] Use psprintf to simplify gtsvectorout() > > The buffer allocation was correct, but looked archaic and scary: > > - It was weird to calculate the buffer size before determining which > format string was used. With the same effort, we could've used the > right-sized buffer for each branch. > > - Commit aa0d3504560 added one more possible return string ("all true > bits"), but didn't adjust the code at the top of the function to > calculate the returned string's max size. It was not a live bug, > because the new string was smaller than the existing ones, but > seemed wrong in principle. > > - Use of sprintf() is generally eyebrow-raising these days > > Switch to psprintf(). psprintf() allocates a larger buffer than what > was allocated before, 128 bytes vs 80 bytes, which is acceptable as > this code is not performance or space critical. I find the undocumented EXTRALEN the most confusing :) LGTM. Greetings, Andres Freund
pgsql-hackers by date: