|
| 1 | +Fix reuse when re-adding dispatch source for socket file descriptors. |
| 2 | + |
| 3 | +https://github.com/swiftlang/swift-corelibs-libdispatch/issues/833 |
| 4 | + |
| 5 | +diff --git a/src/event/event_epoll.c b/src/event/event_epoll.c |
| 6 | +index f31d13e..8654104 100644 |
| 7 | +--- a/src/event/event_epoll.c |
| 8 | ++++ b/src/event/event_epoll.c |
| 9 | +@@ -268,7 +268,10 @@ _dispatch_unote_register_muxed(dispatch_unote_t du) |
| 10 | + if (events & ~_dispatch_muxnote_armed_events(dmn)) { |
| 11 | + events |= _dispatch_muxnote_armed_events(dmn); |
| 12 | + if (_dispatch_epoll_update(dmn, events, EPOLL_CTL_MOD) < 0) { |
| 13 | +- dmn = NULL; |
| 14 | ++ // The file descriptor was closed, reregister in epoll |
| 15 | ++ if (_dispatch_epoll_update(dmn, events, EPOLL_CTL_ADD) < 0) { |
| 16 | ++ dmn = NULL; |
| 17 | ++ } |
| 18 | + } else { |
| 19 | + dmn->dmn_events |= events; |
| 20 | + dmn->dmn_disarmed_events &= ~events; |
| 21 | +@@ -319,6 +322,8 @@ _dispatch_unote_unregister_muxed(dispatch_unote_t du) |
| 22 | + dispatch_unote_linkage_t dul = _dispatch_unote_get_linkage(du); |
| 23 | + dispatch_muxnote_t dmn = dul->du_muxnote; |
| 24 | + uint32_t events = dmn->dmn_events; |
| 25 | ++ int has_readers = 1; |
| 26 | ++ int has_writers = 1; |
| 27 | + |
| 28 | + LIST_REMOVE(dul, du_link); |
| 29 | + _LIST_TRASH_ENTRY(dul, du_link); |
| 30 | +@@ -326,6 +331,7 @@ _dispatch_unote_unregister_muxed(dispatch_unote_t du) |
| 31 | + |
| 32 | + if (LIST_EMPTY(&dmn->dmn_readers_head)) { |
| 33 | + events &= (uint32_t)~EPOLLIN; |
| 34 | ++ has_readers = 0; |
| 35 | + if (dmn->dmn_disarmed_events & EPOLLIN) { |
| 36 | + dmn->dmn_disarmed_events &= (uint16_t)~EPOLLIN; |
| 37 | + dmn->dmn_events &= (uint32_t)~EPOLLIN; |
| 38 | +@@ -333,13 +339,14 @@ _dispatch_unote_unregister_muxed(dispatch_unote_t du) |
| 39 | + } |
| 40 | + if (LIST_EMPTY(&dmn->dmn_writers_head)) { |
| 41 | + events &= (uint32_t)~EPOLLOUT; |
| 42 | ++ has_writers = 0; |
| 43 | + if (dmn->dmn_disarmed_events & EPOLLOUT) { |
| 44 | + dmn->dmn_disarmed_events &= (uint16_t)~EPOLLOUT; |
| 45 | + dmn->dmn_events &= (uint32_t)~EPOLLOUT; |
| 46 | + } |
| 47 | + } |
| 48 | + |
| 49 | +- if (events & (EPOLLIN | EPOLLOUT)) { |
| 50 | ++ if (events & (EPOLLIN | EPOLLOUT) || has_readers || has_writers) { |
| 51 | + if (events != _dispatch_muxnote_armed_events(dmn)) { |
| 52 | + dmn->dmn_events = events; |
| 53 | + events = _dispatch_muxnote_armed_events(dmn); |
0 commit comments