#include <grpc/support/port_platform.h>
#include "src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h"
#include <stdint.h>
#include <atomic>
#include <initializer_list>
#include <memory>
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_format.h"
#include <grpc/event_engine/event_engine.h>
#include <grpc/status.h>
#include <grpc/support/log.h>
#include <grpc/support/sync.h>
#include "src/core/lib/event_engine/poller.h"
#include "src/core/lib/event_engine/time_util.h"
#include "src/core/lib/gprpp/crash.h"
#include "src/core/lib/iomgr/port.h"
#ifdef GRPC_LINUX_EPOLL
#include <errno.h>
#include <limits.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <unistd.h>
#include "src/core/lib/event_engine/posix_engine/event_poller.h"
#include "src/core/lib/event_engine/posix_engine/lockfree_event.h"
#include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
#include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h"
#include "src/core/lib/gprpp/fork.h"
#include "src/core/lib/gprpp/status_helper.h"
#include "src/core/lib/gprpp/strerror.h"
#include "src/core/lib/gprpp/sync.h"
#define MAX_EPOLL_EVENTS_HANDLED_PER_ITERATION …
namespace grpc_event_engine {
namespace experimental {
class Epoll1EventHandle : public EventHandle { … };
namespace {
int EpollCreateAndCloexec() { … }
std::list<Epoll1Poller*> fork_poller_list;
Epoll1EventHandle* fork_fd_list_head = …;
gpr_mu fork_fd_list_mu;
void ForkFdListAddHandle(Epoll1EventHandle* handle) { … }
void ForkFdListRemoveHandle(Epoll1EventHandle* handle) { … }
void ForkPollerListAddPoller(Epoll1Poller* poller) { … }
void ForkPollerListRemovePoller(Epoll1Poller* poller) { … }
bool InitEpoll1PollerLinux();
void ResetEventManagerOnFork() { … }
bool InitEpoll1PollerLinux() { … }
}
void Epoll1EventHandle::OrphanHandle(PosixEngineClosure* on_done,
int* release_fd,
absl::string_view reason) { … }
void Epoll1EventHandle::HandleShutdownInternal(absl::Status why,
bool releasing_fd) { … }
Epoll1Poller::Epoll1Poller(Scheduler* scheduler)
: … { … }
void Epoll1Poller::Shutdown() { … }
void Epoll1Poller::Close() { … }
Epoll1Poller::~Epoll1Poller() { … }
EventHandle* Epoll1Poller::CreateHandle(int fd, absl::string_view ,
bool track_err) { … }
bool Epoll1Poller::ProcessEpollEvents(int max_epoll_events_to_handle,
Events& pending_events) { … }
int Epoll1Poller::DoEpollWait(EventEngine::Duration timeout) { … }
void Epoll1EventHandle::ShutdownHandle(absl::Status why) { … }
bool Epoll1EventHandle::IsHandleShutdown() { … }
void Epoll1EventHandle::NotifyOnRead(PosixEngineClosure* on_read) { … }
void Epoll1EventHandle::NotifyOnWrite(PosixEngineClosure* on_write) { … }
void Epoll1EventHandle::NotifyOnError(PosixEngineClosure* on_error) { … }
void Epoll1EventHandle::SetReadable() { … }
void Epoll1EventHandle::SetWritable() { … }
void Epoll1EventHandle::SetHasError() { … }
Poller::WorkResult Epoll1Poller::Work(
EventEngine::Duration timeout,
absl::FunctionRef<void()> schedule_poll_again) { … }
void Epoll1Poller::Kick() { … }
Epoll1Poller* MakeEpoll1Poller(Scheduler* scheduler) { … }
void Epoll1Poller::PrepareFork() { … }
void Epoll1Poller::PostforkParent() { … }
void Epoll1Poller::PostforkChild() { … }
}
}
#else
#if defined(GRPC_POSIX_SOCKET_EV_EPOLL1)
namespace grpc_event_engine {
namespace experimental {
using ::grpc_event_engine::experimental::EventEngine;
using ::grpc_event_engine::experimental::Poller;
Epoll1Poller::Epoll1Poller(Scheduler* ) {
grpc_core::Crash("unimplemented");
}
void Epoll1Poller::Shutdown() { grpc_core::Crash("unimplemented"); }
Epoll1Poller::~Epoll1Poller() { grpc_core::Crash("unimplemented"); }
EventHandle* Epoll1Poller::CreateHandle(int , absl::string_view ,
bool ) {
grpc_core::Crash("unimplemented");
}
bool Epoll1Poller::ProcessEpollEvents(int ,
Events& ) {
grpc_core::Crash("unimplemented");
}
int Epoll1Poller::DoEpollWait(EventEngine::Duration ) {
grpc_core::Crash("unimplemented");
}
Poller::WorkResult Epoll1Poller::Work(
EventEngine::Duration ,
absl::FunctionRef<void()> ) {
grpc_core::Crash("unimplemented");
}
void Epoll1Poller::Kick() { grpc_core::Crash("unimplemented"); }
Epoll1Poller* MakeEpoll1Poller(Scheduler* ) { return nullptr; }
void Epoll1Poller::PrepareFork() {}
void Epoll1Poller::PostforkParent() {}
void Epoll1Poller::PostforkChild() {}
}
}
#endif
#endif