Explicitly enable epoll on manylinux1

For some reason, the glibc version check does not enable
GRPC_LINUX_EPOLL on manylinux1. This commit:

* Explicitly enables GRPC_LINUX_LEGACY_EPOLL on MANYLINUX1
* Switches the flag to enable epoll1 IO manager to
  GRPC_LINUX_LEGACY_EPOLL instead of GRPC_LINUX_EPOLL.
  This is to ensure epollex and epollsig that are not yet
  compatible with epoll_create (not epoll_create1) do not
  get activated unintentionally.
pull/14052/head
Mehrdad Afshari 7 years ago
parent 3538efb53b
commit 8b0e9fb17e
  1. 27
      src/core/lib/iomgr/ev_epoll1_linux.cc
  2. 4
      src/core/lib/iomgr/port.h

@ -20,8 +20,9 @@
#include <grpc/support/log.h>
/* This polling engine is only relevant on linux kernels supporting epoll() */
#ifdef GRPC_LINUX_EPOLL
/* This polling engine is only relevant on linux kernels supporting epoll
epoll_create() or epoll_create1() */
#ifdef GRPC_LINUX_LEGACY_EPOLL
#include "src/core/lib/iomgr/ev_epoll1_linux.h"
#include <assert.h>
@ -85,31 +86,27 @@ typedef struct epoll_set {
/* The global singleton epoll set */
static epoll_set g_epoll_set;
static int epoll_create_and_set_flag() {
static int epoll_create_and_cloexec() {
#ifdef GRPC_LINUX_EPOLL_CREATE1
int fd = epoll_create1(EPOLL_CLOEXEC);
if (fd >= 0) {
return fd;
if (fd < 0) {
gpr_log(GPR_ERROR, "epoll_create1 unavailable");
}
gpr_log(GPR_ERROR, "epoll_create1 unavailable");
return -1;
#else
int fd = epoll_create(MAX_EPOLL_EVENTS);
if (fd < 0) {
gpr_log(GPR_ERROR, "epoll_create unavailable");
} else if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) {
gpr_log(GPR_ERROR, "fcntl following epoll_create failed");
return -1;
}
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == 0) {
return fd;
}
gpr_log(GPR_ERROR, "fcntl following epoll_create failed");
return -1;
#endif
return fd;
}
/* Must be called *only* once */
static bool epoll_set_init() {
g_epoll_set.epfd = epoll_create_and_set_flag();
g_epoll_set.epfd = epoll_create_and_cloexec();
if (g_epoll_set.epfd < 0) {
return false;
}
@ -1248,7 +1245,7 @@ const grpc_event_engine_vtable* grpc_init_epoll1_linux(bool explicit_request) {
return &vtable;
}
#else /* defined(GRPC_LINUX_EPOLL) */
#else /* defined(GRPC_LINUX_LEGACY_EPOLL) */
#if defined(GRPC_POSIX_SOCKET)
#include "src/core/lib/iomgr/ev_epoll1_linux.h"
/* If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return
@ -1257,4 +1254,4 @@ const grpc_event_engine_vtable* grpc_init_epoll1_linux(bool explicit_request) {
return nullptr;
}
#endif /* defined(GRPC_POSIX_SOCKET) */
#endif /* !defined(GRPC_LINUX_EPOLL) */
#endif /* !defined(GRPC_LINUX_LEGACY_EPOLL) */

@ -37,6 +37,7 @@
#define GRPC_POSIX_SOCKETUTILS 1
#define GRPC_POSIX_WAKEUP_FD 1
#define GRPC_TIMER_USE_GENERIC 1
#define GRPC_LINUX_LEGACY_EPOLL 1
#elif defined(GPR_WINDOWS)
#define GRPC_TIMER_USE_GENERIC 1
#define GRPC_WINSOCK_SOCKET 1
@ -68,9 +69,10 @@
#define GRPC_TIMER_USE_GENERIC 1
#ifdef __GLIBC_PREREQ
#if __GLIBC_PREREQ(2, 4)
#define GRPC_LINUX_EPOLL 1
#define GRPC_LINUX_LEGACY_EPOLL 1
#endif
#if __GLIBC_PREREQ(2, 9)
#define GRPC_LINUX_EPOLL 1
#define GRPC_LINUX_EPOLL_CREATE1 1
#define GRPC_LINUX_EVENTFD 1
#endif

Loading…
Cancel
Save