epoll, sepoll and kqueue pollers should check that their fd is not
closed before attempting to close it, otherwise we can end up with
multiple closes of fd #0 upon exit, which is harmless but dirty.
free(epoll_events);
fail_ee:
close(epoll_fd);
- epoll_fd = 0;
+ epoll_fd = -1;
fail_fd:
p->pref = 0;
return 0;
free(fd_evts);
free(epoll_events);
- close(epoll_fd);
- epoll_fd = 0;
+ if (epoll_fd >= 0) {
+ close(epoll_fd);
+ epoll_fd = -1;
+ }
chg_ptr = NULL;
chg_list = NULL;
*/
REGPRM1 static int _do_fork(struct poller *p)
{
- close(epoll_fd);
+ if (epoll_fd >= 0)
+ close(epoll_fd);
epoll_fd = epoll_create(global.maxsock + 1);
if (epoll_fd < 0)
return 0;
if (nbpollers >= MAX_POLLERS)
return;
+
+ epoll_fd = -1;
p = &pollers[nbpollers++];
p->name = "epoll";
free(kev);
fail_kev:
close(kqueue_fd);
- kqueue_fd = 0;
+ kqueue_fd = -1;
fail_fd:
p->pref = 0;
return 0;
free(fd_evts[DIR_WR]);
free(fd_evts[DIR_RD]);
free(kev);
- close(kqueue_fd);
- kqueue_fd = 0;
+
+ if (kqueue_fd >= 0) {
+ close(kqueue_fd);
+ kqueue_fd = -1;
+ }
p->private = NULL;
p->pref = 0;
*/
REGPRM1 static int _do_fork(struct poller *p)
{
- close(kqueue_fd);
+ if (kqueue_fd >= 0)
+ close(kqueue_fd);
kqueue_fd = kqueue();
if (kqueue_fd < 0)
return 0;
if (nbpollers >= MAX_POLLERS)
return;
+
+ kqueue_fd = -1;
p = &pollers[nbpollers++];
p->name = "kqueue";
free(epoll_events);
fail_ee:
close(epoll_fd);
- epoll_fd = 0;
+ epoll_fd = -1;
fail_fd:
p->pref = 0;
return 0;
free(spec_list);
free(epoll_events);
- close(epoll_fd);
- epoll_fd = 0;
+ if (epoll_fd >= 0) {
+ close(epoll_fd);
+ epoll_fd = -1;
+ }
fd_list = NULL;
spec_list = NULL;
*/
REGPRM1 static int _do_fork(struct poller *p)
{
- close(epoll_fd);
+ if (epoll_fd >= 0)
+ close(epoll_fd);
epoll_fd = epoll_create(global.maxsock + 1);
if (epoll_fd < 0)
return 0;
if (nbpollers >= MAX_POLLERS)
return;
+
+ epoll_fd = -1;
p = &pollers[nbpollers++];
p->name = "sepoll";