54#ifdef HAVE_SYS_EPOLL_H
57#ifdef HAVE_SYS_EVENT_H
60#ifdef HAVE_SYS_SIGNALFD_H
61#include <sys/signalfd.h>
88#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
89 defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
91#elif defined(HAVE_SYS_EPOLL_H)
93#elif defined(HAVE_KQUEUE)
94#define WAIT_USE_KQUEUE
95#elif defined(HAVE_POLL)
100#error "no wait set implementation available"
107#if defined(WAIT_USE_POLL) || defined(WAIT_USE_EPOLL)
108#if defined(WAIT_USE_SELF_PIPE) || defined(WAIT_USE_SIGNALFD)
110#elif defined(WAIT_USE_EPOLL) && defined(HAVE_SYS_SIGNALFD_H)
111#define WAIT_USE_SIGNALFD
113#define WAIT_USE_SELF_PIPE
147#if defined(WAIT_USE_EPOLL)
151#elif defined(WAIT_USE_KQUEUE)
156#elif defined(WAIT_USE_POLL)
159#elif defined(WAIT_USE_WIN32)
175#ifdef WAIT_USE_SIGNALFD
180#ifdef WAIT_USE_SELF_PIPE
193#if defined(WAIT_USE_SELF_PIPE) || defined(WAIT_USE_SIGNALFD)
194static void drain(
void);
197#if defined(WAIT_USE_EPOLL)
199#elif defined(WAIT_USE_KQUEUE)
201#elif defined(WAIT_USE_POLL)
203#elif defined(WAIT_USE_WIN32)
215 .
name =
"WaitEventSet",
244#if defined(WAIT_USE_SELF_PIPE)
299 elog(
FATAL,
"fcntl(F_SETFL) failed on read-end of self-pipe: %m");
301 elog(
FATAL,
"fcntl(F_SETFL) failed on write-end of self-pipe: %m");
303 elog(
FATAL,
"fcntl(F_SETFD) failed on read-end of self-pipe: %m");
305 elog(
FATAL,
"fcntl(F_SETFD) failed on write-end of self-pipe: %m");
318#ifdef WAIT_USE_SIGNALFD
349#ifdef WAIT_USE_KQUEUE
380#if defined(WAIT_USE_EPOLL)
382#elif defined(WAIT_USE_KQUEUE)
384#elif defined(WAIT_USE_POLL)
386#elif defined(WAIT_USE_WIN32)
391 if (resowner !=
NULL)
402#if defined(WAIT_USE_EPOLL)
405#elif defined(WAIT_USE_KQUEUE)
406 set->kqueue_ret_events = (
struct kevent *)
data;
408#elif defined(WAIT_USE_POLL)
411#elif defined(WAIT_USE_WIN32)
420 if (resowner !=
NULL)
423 set->
owner = resowner;
426#if defined(WAIT_USE_EPOLL)
428 elog(
ERROR,
"AcquireExternalFD, for epoll_create1, failed: %m");
430 if (set->epoll_fd < 0)
435#elif defined(WAIT_USE_KQUEUE)
437 elog(
ERROR,
"AcquireExternalFD, for kqueue, failed: %m");
438 set->kqueue_fd =
kqueue();
439 if (set->kqueue_fd < 0)
448 close(set->kqueue_fd);
451 elog(
ERROR,
"fcntl(F_SETFD) failed on kqueue descriptor: %m");
453 set->report_postmaster_not_running =
false;
454#elif defined(WAIT_USE_WIN32)
489#if defined(WAIT_USE_EPOLL)
490 close(set->epoll_fd);
492#elif defined(WAIT_USE_KQUEUE)
493 close(set->kqueue_fd);
495#elif defined(WAIT_USE_WIN32)
526#if defined(WAIT_USE_EPOLL)
527 close(set->epoll_fd);
529#elif defined(WAIT_USE_KQUEUE)
587 elog(
ERROR,
"cannot wait on a latch owned by another process");
589 elog(
ERROR,
"cannot wait on more than one latch");
591 elog(
ERROR,
"latch events only support being set");
596 elog(
ERROR,
"cannot wait on latch without a specified latch");
601 elog(
ERROR,
"cannot wait on socket event without a socket");
606 event->events = events;
607 event->user_data = user_data;
609 event->reset =
false;
616#if defined(WAIT_USE_SELF_PIPE)
618#elif defined(WAIT_USE_SIGNALFD)
635#if defined(WAIT_USE_EPOLL)
637#elif defined(WAIT_USE_KQUEUE)
639#elif defined(WAIT_USE_POLL)
641#elif defined(WAIT_USE_WIN32)
659#if defined(WAIT_USE_KQUEUE)
665 event = &set->
events[pos];
666#if defined(WAIT_USE_KQUEUE)
680 elog(
ERROR,
"cannot remove postmaster death event");
691 if (events == event->
events &&
696 elog(
ERROR,
"cannot modify latch event");
699 event->events = events;
704 elog(
ERROR,
"cannot wait on a latch owned by another process");
714#if defined(WAIT_USE_WIN32)
722#if defined(WAIT_USE_EPOLL)
724#elif defined(WAIT_USE_KQUEUE)
726#elif defined(WAIT_USE_POLL)
728#elif defined(WAIT_USE_WIN32)
733#if defined(WAIT_USE_EPOLL)
788#if defined(WAIT_USE_POLL)
827#if defined(WAIT_USE_KQUEUE)
835#define AccessWaitEvent(k_ev) (*((WaitEvent **)(&(k_ev)->udata)))
841 k_ev->ident =
event->fd;
842 k_ev->filter = filter;
959 set->report_postmaster_not_running =
true;
975 set->report_postmaster_not_running =
true;
981#if defined(WAIT_USE_WIN32)
987 HANDLE *handle = &set->handles[
event->pos + 1];
992 *handle = set->
latch->event;
1015 elog(
ERROR,
"failed to create event for socket: error code %d",
1019 elog(
ERROR,
"failed to set up event for socket: error code %d",
1173#if defined(WAIT_USE_EPOLL)
1193 rc =
epoll_wait(set->epoll_fd, set->epoll_ret_events,
1205 errmsg(
"%s() failed: %m",
1310#elif defined(WAIT_USE_KQUEUE)
1343 if (
unlikely(set->report_postmaster_not_running))
1354 set->kqueue_ret_events,
1367 errmsg(
"%s() failed: %m",
1415 set->report_postmaster_not_running =
true;
1464#elif defined(WAIT_USE_POLL)
1493 errmsg(
"%s() failed: %m",
1597#elif defined(WAIT_USE_WIN32)
1700 elog(
ERROR,
"WaitForMultipleObjects() failed: error code %lu",
1777 elog(
ERROR,
"failed to enumerate network events: error code %d",
1872#if (defined(WAIT_USE_POLL) && defined(POLLRDHUP)) || \
1873 defined(WAIT_USE_EPOLL) || \
1874 defined(WAIT_USE_KQUEUE)
1890#if defined(WAIT_USE_SELF_PIPE)
1937#if defined(WAIT_USE_SELF_PIPE) || defined(WAIT_USE_SIGNALFD)
1953#ifdef WAIT_USE_SELF_PIPE
1971#ifdef WAIT_USE_SELF_PIPE
1972 elog(
ERROR,
"read() on self-pipe failed: %m");
1974 elog(
ERROR,
"read() on signalfd failed: %m");
1981#ifdef WAIT_USE_SELF_PIPE
1982 elog(
ERROR,
"unexpected EOF on self-pipe");
1984 elog(
ERROR,
"unexpected EOF on signalfd");
1987 else if (rc <
sizeof(
buf))
2024#if defined(WAIT_USE_SELF_PIPE)
#define pg_memory_barrier()
#define Assert(condition)
#define StaticAssertDecl(condition, errmessage)
int errcode_for_socket_access(void)
#define ereport(elevel,...)
void ReleaseExternalFD(void)
bool AcquireExternalFD(void)
void ReserveExternalFD(void)
#define INSTR_TIME_SET_CURRENT(t)
#define INSTR_TIME_SUBTRACT(x, y)
#define INSTR_TIME_GET_MILLISEC(t)
#define INSTR_TIME_SET_ZERO(t)
void * MemoryContextAllocZero(MemoryContext context, Size size)
void pfree(void *pointer)
MemoryContext TopMemoryContext
static char buf[DEFAULT_XLOG_SEG_SIZE]
bool PostmasterIsAliveInternal(void)
#define PostmasterIsAlive()
static Datum PointerGetDatum(const void *X)
static Pointer DatumGetPointer(Datum X)
int postmaster_alive_fds[2]
#define POSTMASTER_FD_WATCH
static int fd(const char *x, int i)
void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void ResourceOwnerEnlarge(ResourceOwner owner)
#define RELEASE_PRIO_WAITEVENTSETS
@ RESOURCE_RELEASE_AFTER_LOCKS
void pgwin32_dispatch_queued_signals(void)
HANDLE pgwin32_signal_event
sig_atomic_t maybe_sleeping
bool exit_on_postmaster_death
static void pgstat_report_wait_start(uint32 wait_event_info)
static void pgstat_report_wait_end(void)
static void latch_sigurg_handler(SIGNAL_ARGS)
static void sendSelfPipeByte(void)
static void ResourceOwnerForgetWaitEventSet(ResourceOwner owner, WaitEventSet *set)
static int selfpipe_readfd
static const ResourceOwnerDesc wait_event_set_resowner_desc
void FreeWaitEventSetAfterFork(WaitEventSet *set)
static void WaitEventAdjustPoll(WaitEventSet *set, WaitEvent *event)
static int selfpipe_owner_pid
static int selfpipe_writefd
int GetNumRegisteredWaitEvents(WaitEventSet *set)
void WakeupOtherProc(int pid)
static void ResourceOwnerRememberWaitEventSet(ResourceOwner owner, WaitEventSet *set)
void ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
static int WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, WaitEvent *occurred_events, int nevents)
static void ResOwnerReleaseWaitEventSet(Datum res)
void InitializeWaitEventSupport(void)
bool WaitEventSetCanReportClosed(void)
int AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, Latch *latch, void *user_data)
int WaitEventSetWait(WaitEventSet *set, long timeout, WaitEvent *occurred_events, int nevents, uint32 wait_event_info)
static volatile sig_atomic_t waiting
void FreeWaitEventSet(WaitEventSet *set)
WaitEventSet * CreateWaitEventSet(ResourceOwner resowner, int nevents)
#define WL_SOCKET_READABLE
#define WL_EXIT_ON_PM_DEATH
#define WL_SOCKET_CONNECTED
#define WL_POSTMASTER_DEATH
#define WL_SOCKET_WRITEABLE