|
38 | 38 | namespace asio { |
39 | 39 | namespace detail { |
40 | 40 |
|
41 | | -eventfd_select_interrupter::eventfd_select_interrupter() |
| 41 | +eventfd_select_interrupter::eventfd_select_interrupter(bool use_eventfd) |
42 | 42 | { |
43 | | - open_descriptors(); |
| 43 | + open_descriptors(use_eventfd); |
44 | 44 | } |
45 | 45 |
|
46 | | -void eventfd_select_interrupter::open_descriptors() |
| 46 | +void eventfd_select_interrupter::open_descriptors(bool use_eventfd) |
47 | 47 | { |
48 | | -#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 && !defined(__UCLIBC__) |
49 | | - write_descriptor_ = read_descriptor_ = syscall(__NR_eventfd, 0); |
50 | | - if (read_descriptor_ != -1) |
| 48 | + if (use_eventfd) |
51 | 49 | { |
52 | | - ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); |
53 | | - ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); |
54 | | - } |
| 50 | +#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 && !defined(__UCLIBC__) |
| 51 | + write_descriptor_ = read_descriptor_ = syscall(__NR_eventfd, 0); |
| 52 | + if (read_descriptor_ != -1) |
| 53 | + { |
| 54 | + ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); |
| 55 | + ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); |
| 56 | + } |
55 | 57 | #else // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 && !defined(__UCLIBC__) |
56 | 58 | # if defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) |
57 | | - write_descriptor_ = read_descriptor_ = |
58 | | - ::eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); |
| 59 | + write_descriptor_ = read_descriptor_ = |
| 60 | + ::eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); |
59 | 61 | # else // defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) |
60 | | - errno = EINVAL; |
61 | | - write_descriptor_ = read_descriptor_ = -1; |
| 62 | + errno = EINVAL; |
| 63 | + write_descriptor_ = read_descriptor_ = -1; |
62 | 64 | # endif // defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) |
63 | | - if (read_descriptor_ == -1 && errno == EINVAL) |
64 | | - { |
65 | | - write_descriptor_ = read_descriptor_ = ::eventfd(0, 0); |
66 | | - if (read_descriptor_ != -1) |
| 65 | + if (read_descriptor_ == -1 && errno == EINVAL) |
67 | 66 | { |
68 | | - ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); |
69 | | - ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); |
| 67 | + write_descriptor_ = read_descriptor_ = ::eventfd(0, 0); |
| 68 | + if (read_descriptor_ != -1) |
| 69 | + { |
| 70 | + ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); |
| 71 | + ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); |
| 72 | + } |
70 | 73 | } |
71 | | - } |
72 | 74 | #endif // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 && !defined(__UCLIBC__) |
| 75 | + } |
| 76 | + else |
| 77 | + write_descriptor_ = read_descriptor_ = -1; |
73 | 78 |
|
74 | 79 | if (read_descriptor_ == -1) |
75 | 80 | { |
@@ -107,12 +112,10 @@ void eventfd_select_interrupter::close_descriptors() |
107 | 112 |
|
108 | 113 | void eventfd_select_interrupter::recreate() |
109 | 114 | { |
| 115 | + bool use_eventfd = (write_descriptor_ == read_descriptor_); |
110 | 116 | close_descriptors(); |
111 | | - |
112 | | - write_descriptor_ = -1; |
113 | | - read_descriptor_ = -1; |
114 | | - |
115 | | - open_descriptors(); |
| 117 | + write_descriptor_ = read_descriptor_ = -1; |
| 118 | + open_descriptors(use_eventfd); |
116 | 119 | } |
117 | 120 |
|
118 | 121 | void eventfd_select_interrupter::interrupt() |
|
0 commit comments