Обсуждение: make LWLockCounter a global variable

Поиск
Список
Период
Сортировка

make LWLockCounter a global variable

От
Nathan Bossart
Дата:
In lwlock.c, uses of LWLockCounter must first calculate its address in
shared memory with something like this:

    LWLockCounter = (int *) ((char *) MainLWLockArray - sizeof(int));

This appears to have been started by commit 82e861f in order to fix
EXEC_BACKEND builds, but it could also be fixed by adding it to the
BackendParameters struct.  I find the current approach somewhat difficult
to read and understand, so I'd like to switch to the latter approach.  This
is admittedly just nitpicking...

-- 
nathan

Вложения

Re: make LWLockCounter a global variable

От
Tom Lane
Дата:
Nathan Bossart <nathandbossart@gmail.com> writes:
> In lwlock.c, uses of LWLockCounter must first calculate its address in
> shared memory with something like this:

>     LWLockCounter = (int *) ((char *) MainLWLockArray - sizeof(int));

> This appears to have been started by commit 82e861f in order to fix
> EXEC_BACKEND builds, but it could also be fixed by adding it to the
> BackendParameters struct.  I find the current approach somewhat difficult
> to read and understand, so I'd like to switch to the latter approach.  This
> is admittedly just nitpicking...

No objection here.  As a small improvement, perhaps you could swap
around the code in LWLockShmemSize so that the order in which it
considers size contributions matches the physical layout, more
or less like

    /* Calculate total number of locks needed in the main array. */
    numLocks += NumLWLocksForNamedTranches();

+    /* Space for dynamic allocation counter, plus room for alignment. */
+    size = sizeof(int) + LWLOCK_PADDED_SIZE;
+
    /* Space for the LWLock array. */
-    size = mul_size(numLocks, sizeof(LWLockPadded));
+    size = add_size(size, mul_size(numLocks, sizeof(LWLockPadded)));

-    /* Space for dynamic allocation counter, plus room for alignment. */
-    size = add_size(size, sizeof(int) + LWLOCK_PADDED_SIZE);
-
    /* space for named tranches. */
    size = add_size(size, mul_size(NamedLWLockTrancheRequests, sizeof(NamedLWLockTranche)));

I find it a little confusing that that code doesn't line up
exactly with what CreateLWLocks does.

            regards, tom lane



Re: make LWLockCounter a global variable

От
Bertrand Drouvot
Дата:
Hi,

On Thu, Aug 28, 2025 at 05:56:07PM -0400, Tom Lane wrote:
> Nathan Bossart <nathandbossart@gmail.com> writes:
> > In lwlock.c, uses of LWLockCounter must first calculate its address in
> > shared memory with something like this:
> 
> >     LWLockCounter = (int *) ((char *) MainLWLockArray - sizeof(int));
> 
> > This appears to have been started by commit 82e861f in order to fix
> > EXEC_BACKEND builds, but it could also be fixed by adding it to the
> > BackendParameters struct.  I find the current approach somewhat difficult
> > to read and understand, so I'd like to switch to the latter approach.  This
> > is admittedly just nitpicking...
> 
> No objection here.  As a small improvement, perhaps you could swap
> around the code in LWLockShmemSize so that the order in which it
> considers size contributions matches the physical layout, more
> or less like
> 
>     /* Calculate total number of locks needed in the main array. */
>     numLocks += NumLWLocksForNamedTranches();
> 
> +    /* Space for dynamic allocation counter, plus room for alignment. */
> +    size = sizeof(int) + LWLOCK_PADDED_SIZE;
> +
>     /* Space for the LWLock array. */
> -    size = mul_size(numLocks, sizeof(LWLockPadded));
> +    size = add_size(size, mul_size(numLocks, sizeof(LWLockPadded)));
> 
> -    /* Space for dynamic allocation counter, plus room for alignment. */
> -    size = add_size(size, sizeof(int) + LWLOCK_PADDED_SIZE);
> -
>     /* space for named tranches. */
>     size = add_size(size, mul_size(NamedLWLockTrancheRequests, sizeof(NamedLWLockTranche)));
> 
> I find it a little confusing that that code doesn't line up
> exactly with what CreateLWLocks does.

+1.

Another option could be to not change CreateLWLocks() at all, except removing the
local variable:

@@ -423,7 +424,6 @@ CreateLWLocks(void)
        if (!IsUnderPostmaster)
        {
                Size            spaceLocks = LWLockShmemSize();
-               int                *LWLockCounter;

to use the global variable. That way we preserve the current memory layout and
there is no need to change LWLockShmemSize().

Regards,

-- 
Bertrand Drouvot
PostgreSQL Contributors Team
RDS Open Source Databases
Amazon Web Services: https://aws.amazon.com



Re: make LWLockCounter a global variable

От
Nathan Bossart
Дата:
On Fri, Aug 29, 2025 at 06:52:48AM +0000, Bertrand Drouvot wrote:
> On Thu, Aug 28, 2025 at 05:56:07PM -0400, Tom Lane wrote:
>> No objection here.  As a small improvement, perhaps you could swap
>> around the code in LWLockShmemSize so that the order in which it
>> considers size contributions matches the physical layout, more
>> or less like
>> 
>> [...]
>> 
>> I find it a little confusing that that code doesn't line up
>> exactly with what CreateLWLocks does.
> 
> +1.

Good idea.  Here's a new version of the patch.  If CI is happy with it,
I'll go ahead and commit it.

> Another option could be to not change CreateLWLocks() at all, except removing the
> local variable:
> 
> @@ -423,7 +424,6 @@ CreateLWLocks(void)
>         if (!IsUnderPostmaster)
>         {
>                 Size            spaceLocks = LWLockShmemSize();
> -               int                *LWLockCounter;
> 
> to use the global variable. That way we preserve the current memory layout and
> there is no need to change LWLockShmemSize().

That would make the patch smaller, but IMHO it kind-of defeats the purpose,
which is to make this stuff simpler and easier to follow.

-- 
nathan

Вложения

Re: make LWLockCounter a global variable

От
Nathan Bossart
Дата:
On Fri, Aug 29, 2025 at 09:43:26AM -0500, Nathan Bossart wrote:
> Good idea.  Here's a new version of the patch.  If CI is happy with it,
> I'll go ahead and commit it.

Committed.

-- 
nathan