]> git.ipfire.org Git - thirdparty/postgresql.git/commit
Invent a variant of getopt(3) that is thread-safe
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 30 Mar 2026 17:47:13 +0000 (20:47 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 30 Mar 2026 17:47:13 +0000 (20:47 +0300)
commitfd8e3f7ceeed8b0155e124a0da4ec6a4fb53ec1f
treede353e33554ab62c228be7447342463223391fcf
parentc5f7820e5780f5be9cb406834108576b42e568f8
Invent a variant of getopt(3) that is thread-safe

The standard getopt(3) function is not re-entrant nor thread-safe.
That's OK for current usage, but it's one more little thing we need to
change in order to make the server multi-threaded.

There's no standard getopt_r() function on any platform, I presume
because command line arguments are usually parsed early when you start
a program, before launching any threads, so there isn't much need for
it. However, we call it at backend startup to parse options from the
startup packet. Because there's no standard, we're free to define our
own.

The pg_getopt_start/next() implementation is based on the old getopt
implementation, I just gathered all the state variables to a struct.
The non-re-entrant getopt() function is now a wrapper around the
re-entrant variant, on platforms that don't have getopt(3).
getopt_long() is not used in the server, so we don't need to provide a
re-entrant variant of that.

Reviewed-by: Peter Eisentraut <peter@eisentraut.org>
Discussion: https://www.postgresql.org/message-id/d1da5f0e-0d68-47c9-a882-eb22f462752f@iki.fi
src/include/port/pg_getopt_ctx.h [new file with mode: 0644]
src/port/Makefile
src/port/getopt.c
src/port/meson.build
src/port/pg_getopt_ctx.c [new file with mode: 0644]
src/tools/pgindent/typedefs.list