1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-06 07:49:08 +03:00

Make it easy to detach completely from shared memory.

The new function dsm_detach_all() can be used either by postmaster
children that don't wish to take any risk of accidentally corrupting
shared memory; or by forked children of regular backends with
the same need.  This patch also updates the postmaster children that
already do PGSharedMemoryDetach() to do dsm_detach_all() as well.

Per discussion with Tom Lane.
This commit is contained in:
Robert Haas
2014-03-18 07:58:53 -04:00
parent 551fb5ac74
commit 79a4d24f31
5 changed files with 34 additions and 0 deletions

View File

@@ -722,6 +722,8 @@ dsm_attach(dsm_handle h)
/*
* At backend shutdown time, detach any segments that are still attached.
* (This is similar to dsm_detach_all, except that there's no reason to
* unmap the control segment before exiting, so we don't bother.)
*/
void
dsm_backend_shutdown(void)
@@ -735,6 +737,31 @@ dsm_backend_shutdown(void)
}
}
/*
* Detach all shared memory segments, including the control segments. This
* should be called, along with PGSharedMemoryDetach, in processes that
* might inherit mappings but are not intended to be connected to dynamic
* shared memory.
*/
void
dsm_detach_all(void)
{
void *control_address = dsm_control;
while (!dlist_is_empty(&dsm_segment_list))
{
dsm_segment *seg;
seg = dlist_head_element(dsm_segment, node, &dsm_segment_list);
dsm_detach(seg);
}
if (control_address != NULL)
dsm_impl_op(DSM_OP_DETACH, dsm_control_handle, 0,
&dsm_control_impl_private, &control_address,
&dsm_control_mapped_size, ERROR);
}
/*
* Resize an existing shared memory segment.
*