diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index b32c96b63d..de4fbcdfb9 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -869,6 +869,23 @@ FreeWaitEventSet(WaitEventSet *set) pfree(set); } +/* + * Free a previously created WaitEventSet in a child process after a fork(). + */ +void +FreeWaitEventSetAfterFork(WaitEventSet *set) +{ +#if defined(WAIT_USE_EPOLL) + close(set->epoll_fd); + ReleaseExternalFD(); +#elif defined(WAIT_USE_KQUEUE) + /* kqueues are not normally inherited by child processes */ + ReleaseExternalFD(); +#endif + + pfree(set); +} + /* --- * Add an event to the set. Possible events are: * - WL_LATCH_SET: Wait for the latch to be set diff --git a/src/include/storage/latch.h b/src/include/storage/latch.h index c55838db60..63a1fc440c 100644 --- a/src/include/storage/latch.h +++ b/src/include/storage/latch.h @@ -175,6 +175,7 @@ extern void ShutdownLatchSupport(void); extern WaitEventSet *CreateWaitEventSet(MemoryContext context, int nevents); extern void FreeWaitEventSet(WaitEventSet *set); +extern void FreeWaitEventSetAfterFork(WaitEventSet *set); extern int AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch, void *user_data); extern void ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch);