]> granicus.if.org Git - postgresql/commitdiff
Cope with glibc too old to have epoll_create1().
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Apr 2017 21:13:29 +0000 (17:13 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 27 Apr 2017 21:13:54 +0000 (17:13 -0400)
Commit fa31b6f4e supposed that we didn't have to worry about that
anymore, but it seems that RHEL5 is like that, and that's still
a supported platform.  Put back the prior coding under an #ifdef,
adding an explicit fcntl() to retain the desired CLOEXEC property.

Discussion: https://postgr.es/m/12307.1493325329@sss.pgh.pa.us

src/backend/storage/ipc/latch.c

index 86e18a4aa6c11ab28f85667519a9719048ed5f10..437ee6edc5117fee0c3436e55e8c3eec0b3f16d6 100644 (file)
@@ -574,9 +574,18 @@ CreateWaitEventSet(MemoryContext context, int nevents)
        set->nevents_space = nevents;
 
 #if defined(WAIT_USE_EPOLL)
+#ifdef EPOLL_CLOEXEC
        set->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
        if (set->epoll_fd < 0)
                elog(ERROR, "epoll_create1 failed: %m");
+#else
+       /* cope with ancient glibc lacking epoll_create1 (e.g., RHEL5) */
+       set->epoll_fd = epoll_create(nevents);
+       if (set->epoll_fd < 0)
+               elog(ERROR, "epoll_create failed: %m");
+       if (fcntl(set->epoll_fd, F_SETFD, FD_CLOEXEC) == -1)
+               elog(ERROR, "fcntl(F_SETFD) failed on epoll descriptor: %m");
+#endif   /* EPOLL_CLOEXEC */
 #elif defined(WAIT_USE_WIN32)
 
        /*