Commit cb9a0c79 authored by Robert Haas's avatar Robert Haas

Teach on_exit_reset() to discard pending cleanups for dsm.

If a postmaster child invokes fork() and then calls on_exit_reset, that
should be sufficient to let it exit() without breaking anything, but
dynamic shared memory broke that by not updating on_exit_reset() to
discard callbacks registered with dynamic shared memory segments.

Per investigation of a complaint from Tom Lane.
parent 77049443
...@@ -979,6 +979,37 @@ cancel_on_dsm_detach(dsm_segment *seg, on_dsm_detach_callback function, ...@@ -979,6 +979,37 @@ cancel_on_dsm_detach(dsm_segment *seg, on_dsm_detach_callback function,
} }
} }
/*
* Discard all registered on-detach callbacks without executing them.
*/
void
reset_on_dsm_detach(void)
{
dlist_iter iter;
dlist_foreach(iter, &dsm_segment_list)
{
dsm_segment *seg = dlist_container(dsm_segment, node, iter.cur);
/* Throw away explicit on-detach actions one by one. */
while (!slist_is_empty(&seg->on_detach))
{
slist_node *node;
dsm_segment_detach_callback *cb;
node = slist_pop_head_node(&seg->on_detach);
cb = slist_container(dsm_segment_detach_callback, node, node);
pfree(cb);
}
/*
* Decrementing the reference count is a sort of implicit on-detach
* action; make sure we don't do that, either.
*/
seg->control_slot = INVALID_CONTROL_SLOT;
}
}
/* /*
* Create a segment descriptor. * Create a segment descriptor.
*/ */
......
...@@ -400,4 +400,5 @@ on_exit_reset(void) ...@@ -400,4 +400,5 @@ on_exit_reset(void)
before_shmem_exit_index = 0; before_shmem_exit_index = 0;
on_shmem_exit_index = 0; on_shmem_exit_index = 0;
on_proc_exit_index = 0; on_proc_exit_index = 0;
reset_on_dsm_detach();
} }
...@@ -43,5 +43,6 @@ extern void on_dsm_detach(dsm_segment *seg, ...@@ -43,5 +43,6 @@ extern void on_dsm_detach(dsm_segment *seg,
on_dsm_detach_callback function, Datum arg); on_dsm_detach_callback function, Datum arg);
extern void cancel_on_dsm_detach(dsm_segment *seg, extern void cancel_on_dsm_detach(dsm_segment *seg,
on_dsm_detach_callback function, Datum arg); on_dsm_detach_callback function, Datum arg);
extern void reset_on_dsm_detach(void);
#endif /* DSM_H */ #endif /* DSM_H */
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