Skip to content

Commit cbf1960

Browse files
committed
libdispatch: added patch to fix reuse when re-adding dispatch source for socket file descriptors
swiftlang/swift-corelibs-libdispatch#833
1 parent c202c20 commit cbf1960

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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

Comments
 (0)