mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
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.
This commit is contained in:
parent
77049443a1
commit
cb9a0c7987
@ -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)
|
|||||||
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,
|
|||||||
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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user