postgres.git / summary / log / commit / refs

commit    b40b4dd9e10ea701c8d47ccba9407fc32ed384e5
Author:   Robert Haas <rhaas@postgresql.org>
Date:     Tue Nov 15 21:30:35 2016 +0000

    Reserve zero as an invalid DSM handle.
    
    Previously, the handle for the control segment could not be zero, but
    some other DSM segment could potentially have a handle value of zero.
    However, that means that if someone wanted to store a dsm_handle that
    might or might not be valid, they would need a separate boolean to
    keep track of whether the associated value is legal.  That's annoying,
    so change things so that no DSM segment can ever have a handle of 0 -
    or as we call it here, DSM_HANDLE_INVALID.
    
    Thomas Munro.  This was submitted as part of a much larger patch to
    add an malloc-like allocator for dynamic shared memory, but this part
    seems like a good idea independently of the rest of the patch.


src/backend/storage/ipc/dsm.c | 4 +++- src/include/storage/dsm.h | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c index d8066647a07..8c6abe3b45b 100644 --- a/src/backend/storage/ipc/dsm.c +++ b/src/backend/storage/ipc/dsm.c @@ -182,7 +182,7 @@ dsm_postmaster_startup(PGShmemHeader *shim) Assert(dsm_control_address == NULL); Assert(dsm_control_mapped_size == 0); dsm_control_handle = random(); - if (dsm_control_handle == 0) + if (dsm_control_handle == DSM_HANDLE_INVALID) continue; if (dsm_impl_op(DSM_OP_CREATE, dsm_control_handle, segsize, &dsm_control_impl_private, &dsm_control_address, @@ -476,6 +476,8 @@ dsm_create(Size size, int flags) { Assert(seg->mapped_address == NULL && seg->mapped_size == 0); seg->handle = random(); + if (seg->handle == DSM_HANDLE_INVALID) /* Reserve sentinel */ + continue; if (dsm_impl_op(DSM_OP_CREATE, seg->handle, size, &seg->impl_private, &seg->mapped_address, &seg->mapped_size, ERROR)) break; diff --git a/src/include/storage/dsm.h b/src/include/storage/dsm.h index 8be7c9aeeb5..bc91be62131 100644 --- a/src/include/storage/dsm.h +++ b/src/include/storage/dsm.h @@ -19,6 +19,9 @@ typedef struct dsm_segment dsm_segment; #define DSM_CREATE_NULL_IF_MAXSEGMENTS 0x0001 +/* A sentinel value for an invalid DSM handle. */ +#define DSM_HANDLE_INVALID 0 + /* Startup and shutdown functions. */ struct PGShmemHeader; /* avoid including pg_shmem.h */ extern void dsm_cleanup_using_control_segment(dsm_handle old_control_handle); [parent: 0a7481930c78]