0002_adjustments.patch.no_cibot
application/octet-stream
Filename: 0002_adjustments.patch.no_cibot
Type: application/octet-stream
Part: 0
diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c
index dce355e6683..7a9d5c6198b 100644
--- a/src/backend/storage/ipc/shmem.c
+++ b/src/backend/storage/ipc/shmem.c
@@ -125,11 +125,14 @@ void
InitShmemAllocator(PGShmemHeader *seghdr)
{
Size offset;
- int64 hash_size;
HASHCTL info;
int hash_flags;
size_t size;
+#ifndef EXEC_BACKEND
+ Assert(!IsUnderPostmaster);
+#endif
+
Assert(seghdr != NULL);
/*
@@ -139,10 +142,6 @@ InitShmemAllocator(PGShmemHeader *seghdr)
Assert(seghdr == (void *) MAXALIGN(seghdr));
Assert(seghdr->content_offset == MAXALIGN(seghdr->content_offset));
- ShmemSegHdr = seghdr;
- ShmemBase = seghdr;
- ShmemEnd = (char *) ShmemBase + seghdr->totalsize;
-
/*
* Allocations after this point should go through ShmemAlloc, which
* expects to allocate everything on cache line boundaries. Make sure the
@@ -155,18 +154,25 @@ InitShmemAllocator(PGShmemHeader *seghdr)
errmsg("out of shared memory (%zu bytes requested)",
offset)));
+ /*
+ * In postmaster or stand-alone backend, initialize the shared memory
+ * allocator and the spinlock so that we can allocate shared memory for
+ * ShmemIndex using ShmemAlloc(). In a regular backend just set up the
+ * pointers required by ShmemAlloc().
+ */
ShmemAllocator = (ShmemAllocatorData *) ((char *) seghdr + seghdr->content_offset);
- ShmemLock = &ShmemAllocator->shmem_lock;
-#ifndef EXEC_BACKEND
- Assert(!IsUnderPostmaster);
-#endif
if (!IsUnderPostmaster)
{
SpinLockInit(&ShmemAllocator->shmem_lock);
ShmemAllocator->free_offset = offset;
}
+ ShmemLock = &ShmemAllocator->shmem_lock;
+ ShmemSegHdr = seghdr;
+ ShmemBase = seghdr;
+ ShmemEnd = (char *) ShmemBase + seghdr->totalsize;
+
/*
* Create (or attach to) the shared memory index of shmem areas.
*
@@ -174,11 +180,9 @@ InitShmemAllocator(PGShmemHeader *seghdr)
* use ShmemInitHash() here because it relies on ShmemIndex being already
* initialized.
*/
- hash_size = SHMEM_INDEX_SIZE;
-
info.keysize = SHMEM_INDEX_KEYSIZE;
info.entrysize = sizeof(ShmemIndexEnt);
- info.dsize = info.max_dsize = hash_select_dirsize(hash_size);
+ info.dsize = info.max_dsize = hash_select_dirsize(SHMEM_INDEX_SIZE);
info.alloc = ShmemAllocNoError;
hash_flags = HASH_ELEM | HASH_STRINGS | HASH_SHARED_MEM | HASH_ALLOC | HASH_DIRSIZE;
if (!IsUnderPostmaster)
@@ -189,7 +193,7 @@ InitShmemAllocator(PGShmemHeader *seghdr)
else
hash_flags |= HASH_ATTACH;
info.hctl = ShmemAllocator->index;
- ShmemIndex = hash_create("ShmemIndex", hash_size, &info, hash_flags);
+ ShmemIndex = hash_create("ShmemIndex", SHMEM_INDEX_SIZE, &info, hash_flags);
Assert(ShmemIndex != NULL);
}