PostgreSQL Source Code: src/include/storage/dsm.h File Reference (original) (raw)

Go to the source code of this file.

Typedefs
typedef struct dsm_segment dsm_segment
typedef struct PGShmemHeader PGShmemHeader
typedef void(* on_dsm_detach_callback) (dsm_segment *, Datum arg)
Functions
void dsm_cleanup_using_control_segment (dsm_handle old_control_handle)
void dsm_postmaster_startup (PGShmemHeader *)
void dsm_backend_shutdown (void)
void dsm_detach_all (void)
size_t dsm_estimate_size (void)
void dsm_shmem_init (void)
dsm_segment * dsm_create (Size size, int flags)
dsm_segment * dsm_attach (dsm_handle h)
void dsm_detach (dsm_segment *seg)
void dsm_pin_mapping (dsm_segment *seg)
void dsm_unpin_mapping (dsm_segment *seg)
void dsm_pin_segment (dsm_segment *seg)
void dsm_unpin_segment (dsm_handle handle)
dsm_segment * dsm_find_mapping (dsm_handle handle)
void * dsm_segment_address (dsm_segment *seg)
Size dsm_segment_map_length (dsm_segment *seg)
dsm_handle dsm_segment_handle (dsm_segment *seg)
void on_dsm_detach (dsm_segment *seg, on_dsm_detach_callback function, Datum arg)
void cancel_on_dsm_detach (dsm_segment *seg, on_dsm_detach_callback function, Datum arg)
void reset_on_dsm_detach (void)

DSM_CREATE_NULL_IF_MAXSEGMENTS

#define DSM_CREATE_NULL_IF_MAXSEGMENTS 0x0001

Definition at line 20 of file dsm.h.

dsm_segment

Definition at line 18 of file dsm.h.

on_dsm_detach_callback

Definition at line 54 of file dsm.h.

PGShmemHeader

Definition at line 23 of file dsm.h.

cancel_on_dsm_detach()

Definition at line 1147 of file dsm.c.

1149{

1151

1153 {

1155

1158 {

1161 break;

1162 }

1163 }

1164}

static void slist_delete_current(slist_mutable_iter *iter)

#define slist_foreach_modify(iter, lhead)

#define slist_container(type, membername, ptr)

void pfree(void *pointer)

on_exit_nicely_callback function

on_dsm_detach_callback function

References dsm_segment_detach_callback::arg, arg, slist_mutable_iter::cur, dsm_segment_detach_callback::function, function, dsm_segment::on_detach, pfree(), slist_container, slist_delete_current(), and slist_foreach_modify.

Referenced by shm_mq_detach(), and test_shm_mq_setup().

dsm_attach()

Definition at line 665 of file dsm.c.

666{

671

672

674

677

678

679

680

681

682

683

684

685

686

687

689 {

691 if (seg->handle == h)

692 elog(ERROR, "can't attach the same segment more than once");

693 }

694

695

698

699

703 {

704

705

706

707

708

709

710

712 continue;

713

714

716 continue;

717

718

722 {

726 }

727 break;

728 }

730

731

732

733

734

735

736

738 {

741 }

742

743

747

748 return seg;

749}

#define Assert(condition)

static void dsm_backend_startup(void)

static void * dsm_main_space_begin

void dsm_detach(dsm_segment *seg)

static dlist_head dsm_segment_list

static bool dsm_init_done

static dsm_control_header * dsm_control

static dsm_segment * dsm_create_descriptor(void)

#define INVALID_CONTROL_SLOT

static bool is_main_region_dsm_handle(dsm_handle handle)

bool dsm_impl_op(dsm_op op, dsm_handle handle, Size request_size, void **impl_private, void **mapped_address, Size *mapped_size, int elevel)

#define dlist_foreach(iter, lhead)

#define dlist_container(type, membername, ptr)

bool LWLockAcquire(LWLock *lock, LWLockMode mode)

void LWLockRelease(LWLock *lock)

References Assert, dsm_segment::control_slot, dlist_iter::cur, dlist_container, dlist_foreach, dsm_backend_startup(), dsm_control, dsm_create_descriptor(), dsm_detach(), dsm_impl_op(), dsm_init_done, dsm_main_space_begin, DSM_OP_ATTACH, dsm_segment_list, elog, ERROR, fb(), dsm_control_item::first_page, FPM_PAGE_SIZE, dsm_segment::handle, dsm_control_item::handle, i, dsm_segment::impl_private, INVALID_CONTROL_SLOT, is_main_region_dsm_handle(), IsUnderPostmaster, dsm_control_header::item, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), dsm_segment::mapped_address, dsm_segment::mapped_size, dsm_control_header::nitems, nitems, dsm_control_item::npages, and dsm_control_item::refcnt.

Referenced by AttachSession(), autoprewarm_database_main(), dsa_attach(), dsa_get_total_size_from_handle(), get_segment_by_index(), GetNamedDSMSegment(), ParallelApplyWorkerMain(), ParallelWorkerMain(), and test_shm_mq_main().

dsm_backend_shutdown()

void dsm_backend_shutdown ( void ) extern

dsm_cleanup_using_control_segment()

void dsm_cleanup_using_control_segment ( dsm_handle old_control_handle) extern

Definition at line 238 of file dsm.c.

239{

240 void *mapped_address = NULL;

242 void *impl_private = NULL;

244 Size mapped_size = 0;

249

250

251

252

253

254

255

257 &mapped_address, &mapped_size, DEBUG1))

258 return;

259

260

261

262

263

266 {

268 &mapped_address, &mapped_size, LOG);

269 return;

270 }

271

272

273

274

275

278 {

281

282

284 if (refcnt == 0)

285 continue;

286

287

290 continue;

291

292

293 elog(DEBUG2, "cleaning up orphaned dynamic shared memory with ID %u (reference count %u)",

294 handle, refcnt);

295

296

299 }

300

301

303 "cleaning up dynamic shared memory control segment with ID %u",

306 &mapped_address, &mapped_size, LOG);

307}

static bool dsm_control_segment_sane(dsm_control_header *control, Size mapped_size)

References DEBUG1, DEBUG2, dsm_control_segment_sane(), dsm_impl_op(), DSM_OP_ATTACH, DSM_OP_DESTROY, DSM_OP_DETACH, elog, fb(), i, is_main_region_dsm_handle(), LOG, and nitems.

Referenced by PGSharedMemoryCreate().

dsm_create()

Definition at line 516 of file dsm.c.

517{

521 size_t npages = 0;

522 size_t first_page = 0;

525

526

527

528

529

530

532

535

536

538

539

540

541

542

544 {

547 ++npages;

548

551 {

552

557

558 }

559 }

560

562 {

563

564

565

566

569 for (;;)

570 {

572

575 continue;

578 break;

579 }

581 }

582

583

586 {

588 {

590 {

594 }

595 else

598

604 return seg;

605 }

606 }

607

608

610 {

621

626 errmsg("too many dynamic shared memory segments")));

627 }

628

629

631 {

635 }

637

644

645 return seg;

646}

static void ResourceOwnerForgetDSM(ResourceOwner owner, dsm_segment *seg)

static dsm_handle make_main_region_dsm_handle(int slot)

#define DSM_CREATE_NULL_IF_MAXSEGMENTS

#define DSM_HANDLE_INVALID

int errcode(int sqlerrcode)

#define ereport(elevel,...)

bool FreePageManagerGet(FreePageManager *fpm, Size npages, Size *first_page)

void FreePageManagerPut(FreePageManager *fpm, Size first_page, Size npages)

bool IsPostmasterEnvironment

static void dlist_delete(dlist_node *node)

uint32 pg_prng_uint32(pg_prng_state *state)

pg_prng_state pg_global_prng_state

void * impl_private_pm_handle

References Assert, dsm_segment::control_slot, dlist_delete(), dsm_backend_startup(), dsm_control, dsm_create_descriptor(), DSM_CREATE_NULL_IF_MAXSEGMENTS, DSM_HANDLE_INVALID, dsm_impl_op(), dsm_init_done, dsm_main_space_begin, DSM_OP_CREATE, DSM_OP_DESTROY, ereport, errcode(), errmsg, ERROR, fb(), dsm_control_item::first_page, FPM_PAGE_SIZE, FreePageManagerGet(), FreePageManagerPut(), dsm_segment::handle, dsm_control_item::handle, i, dsm_segment::impl_private, dsm_control_item::impl_private_pm_handle, is_main_region_dsm_handle(), IsPostmasterEnvironment, IsUnderPostmaster, dsm_control_header::item, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), make_main_region_dsm_handle(), dsm_segment::mapped_address, dsm_segment::mapped_size, dsm_control_header::maxitems, dsm_control_header::nitems, nitems, dsm_segment::node, dsm_control_item::npages, pfree(), pg_global_prng_state, pg_prng_uint32(), dsm_control_item::pinned, dsm_control_item::refcnt, ResourceOwnerForgetDSM(), dsm_segment::resowner, and WARNING.

Referenced by apw_load_buffers(), dsa_create_ext(), GetNamedDSMSegment(), GetSessionDsmHandle(), InitializeParallelDSM(), make_new_segment(), pa_setup_dsm(), and setup_dynamic_shared_memory().

dsm_detach()

Definition at line 803 of file dsm.c.

804{

805

806

807

808

809

810

811

812

815 {

820

826

828 }

830

831

832

833

834

835

836

837

838

840 {

847 }

848

849

851 {

854

861

862

863 if (refcnt == 1)

864 {

865

867

868

869

870

871

872

873

874

875

876

877

878

879

880

881

882

886 {

896 }

897 }

898 }

899

900

905}

void(* on_dsm_detach_callback)(dsm_segment *, Datum arg)

static bool slist_is_empty(const slist_head *head)

static slist_node * slist_pop_head_node(slist_head *head)

#define RESUME_INTERRUPTS()

#define HOLD_INTERRUPTS()

References dsm_segment_detach_callback::arg, arg, Assert, dsm_segment::control_slot, dlist_delete(), dsm_control, dsm_impl_op(), dsm_main_space_begin, DSM_OP_DESTROY, DSM_OP_DETACH, fb(), dsm_control_item::first_page, FreePageManagerPut(), dsm_segment_detach_callback::function, function, dsm_segment::handle, dsm_control_item::handle, HOLD_INTERRUPTS, dsm_segment::impl_private, INVALID_CONTROL_SLOT, is_main_region_dsm_handle(), dsm_control_header::item, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), dsm_segment::mapped_address, dsm_segment::mapped_size, dsm_segment::node, dsm_control_item::npages, dsm_segment::on_detach, pfree(), dsm_control_item::pinned, dsm_control_item::refcnt, ResourceOwnerForgetDSM(), dsm_segment::resowner, RESUME_INTERRUPTS, slist_container, slist_is_empty(), slist_pop_head_node(), and WARNING.

Referenced by apw_load_buffers(), autoprewarm_database_main(), check_for_freed_segments_locked(), destroy_superblock(), DestroyParallelContext(), DetachSession(), dsa_detach(), dsa_get_total_size_from_handle(), dsm_attach(), dsm_backend_shutdown(), dsm_detach_all(), pa_free_worker_info(), pa_shutdown(), ParallelWorkerShutdown(), ResOwnerReleaseDSM(), test_shm_mq(), test_shm_mq_main(), and test_shm_mq_pipelined().

dsm_detach_all()

Definition at line 775 of file dsm.c.

776{

778

780 {

782

785 }

786

791}

static dsm_handle dsm_control_handle

static Size dsm_control_mapped_size

static void * dsm_control_impl_private

References dlist_head_element, dlist_is_empty(), dsm_control, dsm_control_handle, dsm_control_impl_private, dsm_control_mapped_size, dsm_detach(), dsm_impl_op(), DSM_OP_DETACH, dsm_segment_list, ERROR, and fb().

Referenced by postmaster_child_launch().

dsm_estimate_size()

dsm_find_mapping()

dsm_pin_mapping()

dsm_pin_segment()

Definition at line 955 of file dsm.c.

956{

957 void *handle = NULL;

958

959

960

961

962

963

964

967 elog(ERROR, "cannot pin a segment that is already pinned");

974}

void dsm_impl_pin_segment(dsm_handle handle, void *impl_private, void **impl_private_pm_handle)

References dsm_segment::control_slot, dsm_control, dsm_impl_pin_segment(), elog, ERROR, fb(), dsm_segment::handle, dsm_segment::impl_private, dsm_control_item::impl_private_pm_handle, is_main_region_dsm_handle(), dsm_control_header::item, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), dsm_control_item::pinned, and dsm_control_item::refcnt.

Referenced by dsa_create_ext(), GetNamedDSMSegment(), and make_new_segment().

dsm_postmaster_startup()

Definition at line 177 of file dsm.c.

178{

182

184

185

186

187

188

189

190

193

194

197 elog(DEBUG2, "dynamic shared memory system will support %u segments",

198 maxitems);

200

201

202

203

204

205

206 for (;;)

207 {

210

213 continue;

217 break;

218 }

222 "created dynamic shared memory control segment %u (%zu bytes)",

225

226

230}

static void dsm_postmaster_shutdown(int code, Datum arg)

#define PG_DYNSHMEM_CONTROL_MAGIC

static uint64 dsm_control_bytes_needed(uint32 nitems)

#define PG_DYNSHMEM_SLOTS_PER_BACKEND

#define PG_DYNSHMEM_FIXED_SLOTS

static void dsm_cleanup_for_mmap(void)

int dynamic_shared_memory_type

void on_shmem_exit(pg_on_exit_callback function, Datum arg)

static Datum PointerGetDatum(const void *X)

References Assert, DEBUG2, dsm_cleanup_for_mmap(), dsm_control, dsm_control_bytes_needed(), dsm_control_handle, dsm_control_impl_private, dsm_control_mapped_size, DSM_HANDLE_INVALID, DSM_IMPL_MMAP, dsm_impl_op(), DSM_OP_CREATE, dsm_postmaster_shutdown(), dynamic_shared_memory_type, elog, ERROR, fb(), IsUnderPostmaster, dsm_control_header::magic, MaxBackends, dsm_control_header::maxitems, dsm_control_header::nitems, on_shmem_exit(), PG_DYNSHMEM_CONTROL_MAGIC, PG_DYNSHMEM_FIXED_SLOTS, PG_DYNSHMEM_SLOTS_PER_BACKEND, pg_global_prng_state, pg_prng_uint32(), and PointerGetDatum().

Referenced by CreateSharedMemoryAndSemaphores().

dsm_segment_address()

Definition at line 1095 of file dsm.c.

References Assert, fb(), and dsm_segment::mapped_address.

Referenced by apw_load_buffers(), AttachSession(), autoprewarm_database_main(), dsa_attach(), dsa_create_ext(), dsa_get_total_size_from_handle(), get_segment_by_index(), GetNamedDSMSegment(), GetSessionDsmHandle(), InitializeParallelDSM(), make_new_segment(), pa_setup_dsm(), ParallelApplyWorkerMain(), ParallelWorkerMain(), setup_dynamic_shared_memory(), and test_shm_mq_main().

dsm_segment_handle()

dsm_segment_map_length()

dsm_shmem_init()

dsm_unpin_mapping()

dsm_unpin_segment()

Definition at line 988 of file dsm.c.

989{

991 bool destroy = false;

993

994

997 {

998

1000 continue;

1001

1002

1004 {

1005 control_slot = i;

1006 break;

1007 }

1008 }

1009

1010

1011

1012

1013

1014

1016 elog(ERROR, "cannot unpin unknown segment handle");

1018 elog(ERROR, "cannot unpin a segment that is not pinned");

1020

1021

1022

1023

1024

1025

1029

1030

1032 destroy = true;

1034

1035

1037

1038

1039 if (destroy)

1040 {

1044

1045

1046

1047

1048

1049

1050

1051

1052

1053

1054

1058 {

1068 }

1069 }

1070}

void dsm_impl_unpin_segment(dsm_handle handle, void **impl_private)

References Assert, dsm_control, dsm_impl_op(), dsm_impl_unpin_segment(), dsm_main_space_begin, DSM_OP_DESTROY, elog, ERROR, fb(), dsm_control_item::first_page, FreePageManagerPut(), dsm_control_item::handle, i, dsm_control_item::impl_private_pm_handle, INVALID_CONTROL_SLOT, is_main_region_dsm_handle(), dsm_control_header::item, LW_EXCLUSIVE, LWLockAcquire(), LWLockRelease(), dsm_control_header::nitems, dsm_control_item::npages, dsm_control_item::pinned, dsm_control_item::refcnt, and WARNING.

Referenced by destroy_superblock(), and dsa_release_in_place().

on_dsm_detach()

Definition at line 1132 of file dsm.c.

1133{

1135

1141}

static void slist_push_head(slist_head *head, slist_node *node)

void * MemoryContextAlloc(MemoryContext context, Size size)

MemoryContext TopMemoryContext

References dsm_segment_detach_callback::arg, arg, dsm_segment_detach_callback::function, function, MemoryContextAlloc(), dsm_segment_detach_callback::node, dsm_segment::on_detach, slist_push_head(), and TopMemoryContext.

Referenced by dsa_attach(), dsa_attach_in_place(), dsa_create_ext(), dsa_create_in_place_ext(), pq_redirect_to_shm_mq(), setup_background_workers(), SharedFileSetAttach(), SharedFileSetInit(), SharedRecordTypmodRegistryAttach(), SharedRecordTypmodRegistryInit(), and shm_mq_attach().

reset_on_dsm_detach()

void reset_on_dsm_detach ( void ) extern

Definition at line 1170 of file dsm.c.

1171{

1173

1175 {

1177

1178

1180 {

1183

1187 }

1188

1189

1190

1191

1192

1194 }

1195}

References dsm_segment::control_slot, dlist_iter::cur, dlist_container, dlist_foreach, dsm_segment_list, INVALID_CONTROL_SLOT, dsm_segment::on_detach, pfree(), slist_container, slist_is_empty(), and slist_pop_head_node().

Referenced by on_exit_reset().