Re: make BuiltinTrancheNames less ugly

Поиск
Список
Период
Сортировка
От Tristan Partin
Тема Re: make BuiltinTrancheNames less ugly
Дата
Msg-id CZ39FY6HU2SU.3KLHDJQJ9O21Q@neon.tech
обсуждение исходный текст
Ответ на Re: make BuiltinTrancheNames less ugly  (Alvaro Herrera <alvherre@alvh.no-ip.org>)
Ответы Re: make BuiltinTrancheNames less ugly  (Heikki Linnakangas <hlinnaka@iki.fi>)
Список pgsql-hackers
On Wed Jan 24, 2024 at 8:09 AM CST, Alvaro Herrera wrote:
> From 3d24b89855888a6650ec1aafb3579d810bfec5ac Mon Sep 17 00:00:00 2001
> From: Alvaro Herrera <alvherre@alvh.no-ip.org>
> Date: Tue, 23 Jan 2024 10:36:14 +0100
> Subject: [PATCH] Remove IndividualLWLockNames
>
> We can just merge the lwlock names into the BuiltinTrancheNames array.
> This requires that Meson compiles the file with -I. in CPPFLAGS, which
> in turn requires some additional contortions for DTrace support in
> FreeBSD.
> ---
>  src/backend/meson.build                          |  4 +++-
>  src/backend/storage/lmgr/Makefile                |  3 ++-
>  src/backend/storage/lmgr/generate-lwlocknames.pl | 10 ++--------
>  src/backend/storage/lmgr/lwlock.c                | 13 ++++---------
>  src/backend/storage/lmgr/meson.build             | 12 ++++++++++--
>  5 files changed, 21 insertions(+), 21 deletions(-)
>
> diff --git a/src/backend/meson.build b/src/backend/meson.build
> index 8767aaba67..57a52c37e0 100644
> --- a/src/backend/meson.build
> +++ b/src/backend/meson.build
> @@ -127,7 +127,9 @@ backend_objs = [postgres_lib.extract_all_objects(recursive: false)]
>  if dtrace.found() and host_system != 'darwin'
>    backend_input += custom_target(
>      'probes.o',
> -    input: ['utils/probes.d', postgres_lib.extract_objects(backend_sources, timezone_sources)],
> +    input: ['utils/probes.d',
> +      postgres_lib.extract_objects(backend_sources, timezone_sources),
> +      lwlock_lib.extract_objects(lwlock_source)],
>      output: 'probes.o',
>      command: [dtrace, '-C', '-G', '-o', '@OUTPUT@', '-s', '@INPUT@'],
>      install: false,
> diff --git a/src/backend/storage/lmgr/Makefile b/src/backend/storage/lmgr/Makefile
> index 504480e847..81da6ee13a 100644
> --- a/src/backend/storage/lmgr/Makefile
> +++ b/src/backend/storage/lmgr/Makefile
> @@ -12,13 +12,14 @@ subdir = src/backend/storage/lmgr
>  top_builddir = ../../../..
>  include $(top_builddir)/src/Makefile.global
>
> +override CPPFLAGS := -I. $(CPPFLAGS)
> +
>  OBJS = \
>      condition_variable.o \
>      deadlock.o \
>      lmgr.o \
>      lock.o \
>      lwlock.o \
> -    lwlocknames.o \
>      predicate.o \
>      proc.o \
>      s_lock.o \
> diff --git a/src/backend/storage/lmgr/generate-lwlocknames.pl b/src/backend/storage/lmgr/generate-lwlocknames.pl
> index 7b93ecf6c1..a679a4ff54 100644
> --- a/src/backend/storage/lmgr/generate-lwlocknames.pl
> +++ b/src/backend/storage/lmgr/generate-lwlocknames.pl
> @@ -10,7 +10,6 @@ use Getopt::Long;
>  my $output_path = '.';
>
>  my $lastlockidx = -1;
> -my $continue = "\n";
>
>  GetOptions('outdir:s' => \$output_path);
>
> @@ -29,8 +28,6 @@ print $h $autogen;
>  print $h "/* there is deliberately not an #ifndef LWLOCKNAMES_H here */\n\n";
>  print $c $autogen, "\n";
>
> -print $c "const char *const IndividualLWLockNames[] = {";
> -
>  #
>  # First, record the predefined LWLocks listed in wait_event_names.txt.  We'll
>  # cross-check those with the ones in lwlocknames.txt.
> @@ -97,12 +94,10 @@ while (<$lwlocknames>)
>      while ($lastlockidx < $lockidx - 1)
>      {
>          ++$lastlockidx;
> -        printf $c "%s    \"<unassigned:%d>\"", $continue, $lastlockidx;
> -        $continue = ",\n";
> +        printf $c "[%s] = \"<unassigned:%d>\",\n", $lastlockidx, $lastlockidx;
>      }
> -    printf $c "%s    \"%s\"", $continue, $trimmedlockname;
> +    printf $c "[%s] = \"%s\",\n", $lockidx, $trimmedlockname;
>      $lastlockidx = $lockidx;
> -    $continue = ",\n";
>
>      print $h "#define $lockname (&MainLWLockArray[$lockidx].lock)\n";
>  }
> @@ -112,7 +107,6 @@ die
>    . "lwlocknames.txt"
>    if $i < scalar @wait_event_lwlocks;
>
> -printf $c "\n};\n";
>  print $h "\n";
>  printf $h "#define NUM_INDIVIDUAL_LWLOCKS        %s\n", $lastlockidx + 1;
>
> diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c
> index 98fa6035cc..8aad9c6690 100644
> --- a/src/backend/storage/lmgr/lwlock.c
> +++ b/src/backend/storage/lmgr/lwlock.c
> @@ -115,8 +115,8 @@ StaticAssertDecl(LW_VAL_EXCLUSIVE > (uint32) MAX_BACKENDS,
>   * There are three sorts of LWLock "tranches":
>   *
>   * 1. The individually-named locks defined in lwlocknames.h each have their
> - * own tranche.  The names of these tranches appear in IndividualLWLockNames[]
> - * in lwlocknames.c.
> + * own tranche.  The names of these tranches come from lwlocknames.c into
> + * BuiltinTranchNames[] below.
>   *
>   * 2. There are some predefined tranches for built-in groups of locks.
>   * These are listed in enum BuiltinTrancheIds in lwlock.h, and their names
> @@ -129,9 +129,8 @@ StaticAssertDecl(LW_VAL_EXCLUSIVE > (uint32) MAX_BACKENDS,
>   * All these names are user-visible as wait event names, so choose with care
>   * ... and do not forget to update the documentation's list of wait events.
>   */
> -extern const char *const IndividualLWLockNames[];    /* in lwlocknames.c */
> -
>  static const char *const BuiltinTrancheNames[] = {
> +#include "lwlocknames.c"
>      [LWTRANCHE_XACT_BUFFER] = "XactBuffer",
>      [LWTRANCHE_COMMITTS_BUFFER] = "CommitTsBuffer",
>      [LWTRANCHE_SUBTRANS_BUFFER] = "SubtransBuffer",
> @@ -738,11 +737,7 @@ LWLockReportWaitEnd(void)
>  static const char *
>  GetLWTrancheName(uint16 trancheId)
>  {
> -    /* Individual LWLock? */
> -    if (trancheId < NUM_INDIVIDUAL_LWLOCKS)
> -        return IndividualLWLockNames[trancheId];
> -
> -    /* Built-in tranche? */
> +    /* Individual LWLock or built-in tranche? */
>      if (trancheId < LWTRANCHE_FIRST_USER_DEFINED)
>          return BuiltinTrancheNames[trancheId];
>
> diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build
> index da32198f78..a12064ae8a 100644
> --- a/src/backend/storage/lmgr/meson.build
> +++ b/src/backend/storage/lmgr/meson.build
> @@ -5,11 +5,19 @@ backend_sources += files(
>    'deadlock.c',
>    'lmgr.c',
>    'lock.c',
> -  'lwlock.c',
>    'predicate.c',
>    'proc.c',
>    's_lock.c',
>    'spin.c',
>  )
>
> -generated_backend_sources += lwlocknames[1]
> +# this includes a .c file generated. Is there a better way?
> +lwlock_source = files('lwlock.c')

I don't understand this comment. Could you explain it a bit more?

> +
> +lwlock_lib = static_library('lwlock',
> +  lwlock_source,
> +  dependencies: [backend_code],
> +  include_directories: include_directories('../../../include/storage'),
> +  kwargs: internal_lib_args,
> +  )

Move the paren to the beginning of the line.

> +backend_link_with += lwlock_lib

Earlier in the thread you had said this:

> IMO it would be less ugly to have the origin file lwlocknames.txt be
> not a text file but a .h with a macro that can be defined by
> interested parties so that they can extract what they want from the
> file, like PG_CMDTAG or PG_KEYWORD.  Using Perl for this seems dirty...

I really like this idea, and would definitely be more inclined to see
a solution like this.

--
Tristan Partin
Neon (https://neon.tech)



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Laurenz Albe
Дата:
Сообщение: Re: Document efficient self-joins / UPDATE LIMIT techniques.
Следующее
От: Mats Kindahl
Дата:
Сообщение: Re: glibc qsort() vulnerability