Commit 767bc028 authored by Alvaro Herrera's avatar Alvaro Herrera

Allow DSM segments to be created as pinned

dsm_create and dsm_attach assumed that a current resource owner was
always in place.  Exploration with the API show that this is
inconvenient: sometimes one must create a dummy resowner, create/attach
the DSM, only to pin the mapping later, which is wasteful.  Change
create/attach so that if there is no current resowner, the dsm is
effectively pinned right from the start.

Discussion: https://postgr.es/m/20170324232710.32acsfsvjqfgc6ud@alvherre.pgsql
Reviewed by Thomas Munro.
parent 2c4debbd
...@@ -453,6 +453,13 @@ dsm_set_control_handle(dsm_handle h) ...@@ -453,6 +453,13 @@ dsm_set_control_handle(dsm_handle h)
/* /*
* Create a new dynamic shared memory segment. * Create a new dynamic shared memory segment.
*
* If there is a non-NULL CurrentResourceOwner, the new segment is associated
* with it and must be detached before the resource owner releases, or a
* warning will be logged. If CurrentResourceOwner is NULL, the segment
* remains attached until explicitely detached or the session ends.
* Creating with a NULL CurrentResourceOwner is equivalent to creating
* with a non-NULL CurrentResourceOwner and then calling dsm_pin_mapping.
*/ */
dsm_segment * dsm_segment *
dsm_create(Size size, int flags) dsm_create(Size size, int flags)
...@@ -544,6 +551,11 @@ dsm_create(Size size, int flags) ...@@ -544,6 +551,11 @@ dsm_create(Size size, int flags)
* This can happen if we're asked to attach the segment, but then everyone * This can happen if we're asked to attach the segment, but then everyone
* else detaches it (causing it to be destroyed) before we get around to * else detaches it (causing it to be destroyed) before we get around to
* attaching it. * attaching it.
*
* If there is a non-NULL CurrentResourceOwner, the attached segment is
* associated with it and must be detached before the resource owner releases,
* or a warning will be logged. Otherwise the segment remains attached until
* explicitely detached or the session ends. See the note atop dsm_create().
*/ */
dsm_segment * dsm_segment *
dsm_attach(dsm_handle h) dsm_attach(dsm_handle h)
...@@ -1095,7 +1107,8 @@ dsm_create_descriptor(void) ...@@ -1095,7 +1107,8 @@ dsm_create_descriptor(void)
{ {
dsm_segment *seg; dsm_segment *seg;
ResourceOwnerEnlargeDSMs(CurrentResourceOwner); if (CurrentResourceOwner)
ResourceOwnerEnlargeDSMs(CurrentResourceOwner);
seg = MemoryContextAlloc(TopMemoryContext, sizeof(dsm_segment)); seg = MemoryContextAlloc(TopMemoryContext, sizeof(dsm_segment));
dlist_push_head(&dsm_segment_list, &seg->node); dlist_push_head(&dsm_segment_list, &seg->node);
...@@ -1107,7 +1120,8 @@ dsm_create_descriptor(void) ...@@ -1107,7 +1120,8 @@ dsm_create_descriptor(void)
seg->mapped_size = 0; seg->mapped_size = 0;
seg->resowner = CurrentResourceOwner; seg->resowner = CurrentResourceOwner;
ResourceOwnerRememberDSM(CurrentResourceOwner, seg); if (CurrentResourceOwner)
ResourceOwnerRememberDSM(CurrentResourceOwner, seg);
slist_init(&seg->on_detach); slist_init(&seg->on_detach);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment