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.
This commit is contained in:
parent
2c4debbd0f
commit
767bc028e5
@ -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)
|
|||||||
* 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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user