54#ifdef HAVE_SYS_EPOLL_H
57#ifdef HAVE_SYS_EVENT_H
60#ifdef HAVE_SYS_SIGNALFD_H
61#include <sys/signalfd.h>
87#if defined(WAIT_USE_EPOLL) || defined(WAIT_USE_POLL) || \
88 defined(WAIT_USE_KQUEUE) || defined(WAIT_USE_WIN32)
90#elif defined(HAVE_SYS_EPOLL_H)
92#elif defined(HAVE_KQUEUE)
93#define WAIT_USE_KQUEUE
94#elif defined(HAVE_POLL)
99#error "no wait set implementation available"
106#if defined(WAIT_USE_POLL) || defined(WAIT_USE_EPOLL)
107#if defined(WAIT_USE_SELF_PIPE) || defined(WAIT_USE_SIGNALFD)
109#elif defined(WAIT_USE_EPOLL) && defined(HAVE_SYS_SIGNALFD_H)
110#define WAIT_USE_SIGNALFD
112#define WAIT_USE_SELF_PIPE
146#if defined(WAIT_USE_EPOLL)
150#elif defined(WAIT_USE_KQUEUE)
155#elif defined(WAIT_USE_POLL)
158#elif defined(WAIT_USE_WIN32)
174#ifdef WAIT_USE_SIGNALFD
179#ifdef WAIT_USE_SELF_PIPE
192#if defined(WAIT_USE_SELF_PIPE) || defined(WAIT_USE_SIGNALFD)
193static void drain(
void);
196#if defined(WAIT_USE_EPOLL)
198#elif defined(WAIT_USE_KQUEUE)
200#elif defined(WAIT_USE_POLL)
202#elif defined(WAIT_USE_WIN32)
214 .
name =
"WaitEventSet",
243#if defined(WAIT_USE_SELF_PIPE)
298 elog(
FATAL,
"fcntl(F_SETFL) failed on read-end of self-pipe: %m");
300 elog(
FATAL,
"fcntl(F_SETFL) failed on write-end of self-pipe: %m");
302 elog(
FATAL,
"fcntl(F_SETFD) failed on read-end of self-pipe: %m");
304 elog(
FATAL,
"fcntl(F_SETFD) failed on write-end of self-pipe: %m");
317#ifdef WAIT_USE_SIGNALFD
348#ifdef WAIT_USE_KQUEUE
379#if defined(WAIT_USE_EPOLL)
381#elif defined(WAIT_USE_KQUEUE)
383#elif defined(WAIT_USE_POLL)
385#elif defined(WAIT_USE_WIN32)
390 if (resowner !=
NULL)
401#if defined(WAIT_USE_EPOLL)
404#elif defined(WAIT_USE_KQUEUE)
405 set->kqueue_ret_events = (
struct kevent *)
data;
407#elif defined(WAIT_USE_POLL)
410#elif defined(WAIT_USE_WIN32)
419 if (resowner !=
NULL)
422 set->
owner = resowner;
425#if defined(WAIT_USE_EPOLL)
427 elog(
ERROR,
"AcquireExternalFD, for epoll_create1, failed: %m");
429 if (set->epoll_fd < 0)
434#elif defined(WAIT_USE_KQUEUE)
436 elog(
ERROR,
"AcquireExternalFD, for kqueue, failed: %m");
437 set->kqueue_fd =
kqueue();
438 if (set->kqueue_fd < 0)
447 close(set->kqueue_fd);
450 elog(
ERROR,
"fcntl(F_SETFD) failed on kqueue descriptor: %m");
452 set->report_postmaster_not_running =
false;
453#elif defined(WAIT_USE_WIN32)
488#if defined(WAIT_USE_EPOLL)
489 close(set->epoll_fd);
491#elif defined(WAIT_USE_KQUEUE)
492 close(set->kqueue_fd);
494#elif defined(WAIT_USE_WIN32)
525#if defined(WAIT_USE_EPOLL)
526 close(set->epoll_fd);
528#elif defined(WAIT_USE_KQUEUE)
586 elog(
ERROR,
"cannot wait on a latch owned by another process");
588 elog(
ERROR,
"cannot wait on more than one latch");
590 elog(
ERROR,
"latch events only support being set");
595 elog(
ERROR,
"cannot wait on latch without a specified latch");
600 elog(
ERROR,
"cannot wait on socket event without a socket");
605 event->events = events;
606 event->user_data = user_data;
608 event->reset =
false;
615#if defined(WAIT_USE_SELF_PIPE)
617#elif defined(WAIT_USE_SIGNALFD)
634#if defined(WAIT_USE_EPOLL)
636#elif defined(WAIT_USE_KQUEUE)
638#elif defined(WAIT_USE_POLL)
640#elif defined(WAIT_USE_WIN32)
658#if defined(WAIT_USE_KQUEUE)
664 event = &set->
events[pos];
665#if defined(WAIT_USE_KQUEUE)
679 elog(
ERROR,
"cannot remove postmaster death event");
690 if (events == event->
events &&
695 elog(
ERROR,
"cannot modify latch event");
698 event->events = events;
703 elog(
ERROR,
"cannot wait on a latch owned by another process");
713#if defined(WAIT_USE_WIN32)
721#if defined(WAIT_USE_EPOLL)
723#elif defined(WAIT_USE_KQUEUE)
725#elif defined(WAIT_USE_POLL)
727#elif defined(WAIT_USE_WIN32)
732#if defined(WAIT_USE_EPOLL)
787#if defined(WAIT_USE_POLL)
826#if defined(WAIT_USE_KQUEUE)
834#define AccessWaitEvent(k_ev) (*((WaitEvent **)(&(k_ev)->udata)))
840 k_ev->ident =
event->fd;
841 k_ev->filter = filter;
958 set->report_postmaster_not_running =
true;
974 set->report_postmaster_not_running =
true;
980#if defined(WAIT_USE_WIN32)
986 HANDLE *handle = &set->handles[
event->pos + 1];
991 *handle = set->
latch->event;
1014 elog(
ERROR,
"failed to create event for socket: error code %d",
1018 elog(
ERROR,
"failed to set up event for socket: error code %d",
1172#if defined(WAIT_USE_EPOLL)
1192 rc =
epoll_wait(set->epoll_fd, set->epoll_ret_events,
1204 errmsg(
"%s() failed: %m",
1309#elif defined(WAIT_USE_KQUEUE)
1342 if (
unlikely(set->report_postmaster_not_running))
1353 set->kqueue_ret_events,
1366 errmsg(
"%s() failed: %m",
1414 set->report_postmaster_not_running =
true;
1463#elif defined(WAIT_USE_POLL)
1492 errmsg(
"%s() failed: %m",
1596#elif defined(WAIT_USE_WIN32)
1699 elog(
ERROR,
"WaitForMultipleObjects() failed: error code %lu",
1776 elog(
ERROR,
"failed to enumerate network events: error code %d",
1871#if (defined(WAIT_USE_POLL) && defined(POLLRDHUP)) || \
1872 defined(WAIT_USE_EPOLL) || \
1873 defined(WAIT_USE_KQUEUE)
1889#if defined(WAIT_USE_SELF_PIPE)
1936#if defined(WAIT_USE_SELF_PIPE) || defined(WAIT_USE_SIGNALFD)
1952#ifdef WAIT_USE_SELF_PIPE
1970#ifdef WAIT_USE_SELF_PIPE
1971 elog(
ERROR,
"read() on self-pipe failed: %m");
1973 elog(
ERROR,
"read() on signalfd failed: %m");
1980#ifdef WAIT_USE_SELF_PIPE
1981 elog(
ERROR,
"unexpected EOF on self-pipe");
1983 elog(
ERROR,
"unexpected EOF on signalfd");
1986 else if (rc <
sizeof(
buf))
2023#if defined(WAIT_USE_SELF_PIPE)
#define pg_memory_barrier()
#define Assert(condition)
#define StaticAssertDecl(condition, errmessage)
int errcode_for_socket_access(void)
int errmsg(const char *fmt,...)
#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