diff --git a/src/ev_epoll.c b/src/ev_epoll.c index 7be659bc1..884c03837 100644 --- a/src/ev_epoll.c +++ b/src/ev_epoll.c @@ -169,16 +169,24 @@ static void _do_poll(struct poller *p, int exp, int wake) for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) { fd = fd_updt[updt_idx]; - _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~ti->ltid_bit); - if (!fdtab[fd].owner) { + if (!fd_grab_tgid(fd, tgid)) { + /* was reassigned */ activity[tid].poll_drop_fd++; continue; } - _update_fd(fd); + _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~ti->ltid_bit); + + if (fdtab[fd].owner) + _update_fd(fd); + else + activity[tid].poll_drop_fd++; + + fd_drop_tgid(fd); } fd_nbupdt = 0; - /* Scan the global update list */ + + /* Scan the shared update list */ for (old_fd = fd = update_list[tgid - 1].first; fd != -1; fd = fdtab[fd].update.next) { if (fd == -2) { fd = old_fd; @@ -188,13 +196,24 @@ static void _do_poll(struct poller *p, int exp, int wake) fd = -fd -4; if (fd == -1) break; - if (fdtab[fd].update_mask & ti->ltid_bit) - done_update_polling(fd); + + if (!fd_grab_tgid(fd, tgid)) { + /* was reassigned */ + activity[tid].poll_drop_fd++; + continue; + } + + if (!(fdtab[fd].update_mask & ti->ltid_bit)) + continue; + + done_update_polling(fd); + + if (fdtab[fd].owner) + _update_fd(fd); else - continue; - if (!fdtab[fd].owner) - continue; - _update_fd(fd); + activity[tid].poll_drop_fd++; + + fd_drop_tgid(fd); } thread_idle_now(); diff --git a/src/ev_evports.c b/src/ev_evports.c index 79854702a..19d572c66 100644 --- a/src/ev_evports.c +++ b/src/ev_evports.c @@ -126,16 +126,24 @@ static void _do_poll(struct poller *p, int exp, int wake) for (i = 0; i < fd_nbupdt; i++) { fd = fd_updt[i]; - _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~ti->ltid_bit); - if (fdtab[fd].owner == NULL) { + if (!fd_grab_tgid(fd, tgid)) { + /* was reassigned */ activity[tid].poll_drop_fd++; continue; } - _update_fd(fd); + _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~ti->ltid_bit); + + if (fdtab[fd].owner) + _update_fd(fd); + else + activity[tid].poll_drop_fd++; + + fd_drop_tgid(fd); } fd_nbupdt = 0; - /* Scan the global update list */ + + /* Scan the shared update list */ for (old_fd = fd = update_list[tgid - 1].first; fd != -1; fd = fdtab[fd].update.next) { if (fd == -2) { fd = old_fd; @@ -145,13 +153,24 @@ static void _do_poll(struct poller *p, int exp, int wake) fd = -fd -4; if (fd == -1) break; - if (fdtab[fd].update_mask & ti->ltid_bit) - done_update_polling(fd); + + if (!fd_grab_tgid(fd, tgid)) { + /* was reassigned */ + activity[tid].poll_drop_fd++; + continue; + } + + if (!(fdtab[fd].update_mask & ti->ltid_bit)) + continue; + + done_update_polling(fd); + + if (fdtab[fd].owner) + _update_fd(fd); else - continue; - if (!fdtab[fd].owner) - continue; - _update_fd(fd); + activity[tid].poll_drop_fd++; + + fd_drop_tgid(fd); } thread_idle_now(); diff --git a/src/ev_kqueue.c b/src/ev_kqueue.c index 53bda1fe2..3d555ec7e 100644 --- a/src/ev_kqueue.c +++ b/src/ev_kqueue.c @@ -102,12 +102,20 @@ static void _do_poll(struct poller *p, int exp, int wake) for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) { fd = fd_updt[updt_idx]; - _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~ti->ltid_bit); - if (!fdtab[fd].owner) { + if (!fd_grab_tgid(fd, tgid)) { + /* was reassigned */ activity[tid].poll_drop_fd++; continue; } - changes = _update_fd(fd, changes); + + _HA_ATOMIC_AND(&fdtab[fd].update_mask, ~ti->ltid_bit); + + if (fdtab[fd].owner) + changes = _update_fd(fd, changes); + else + activity[tid].poll_drop_fd++; + + fd_drop_tgid(fd); } /* Scan the global update list */ for (old_fd = fd = update_list[tgid - 1].first; fd != -1; fd = fdtab[fd].update.next) { @@ -119,13 +127,24 @@ static void _do_poll(struct poller *p, int exp, int wake) fd = -fd -4; if (fd == -1) break; - if (fdtab[fd].update_mask & ti->ltid_bit) - done_update_polling(fd); + + if (!fd_grab_tgid(fd, tgid)) { + /* was reassigned */ + activity[tid].poll_drop_fd++; + continue; + } + + if (!(fdtab[fd].update_mask & ti->ltid_bit)) + continue; + + done_update_polling(fd); + + if (fdtab[fd].owner) + changes = _update_fd(fd, changes); else - continue; - if (!fdtab[fd].owner) - continue; - changes = _update_fd(fd, changes); + activity[tid].poll_drop_fd++; + + fd_drop_tgid(fd); } thread_idle_now();