… | |
… | |
77 | # ifndef EV_USE_REALTIME |
77 | # ifndef EV_USE_REALTIME |
78 | # define EV_USE_REALTIME 0 |
78 | # define EV_USE_REALTIME 0 |
79 | # endif |
79 | # endif |
80 | # endif |
80 | # endif |
81 | |
81 | |
|
|
82 | # if HAVE_NANOSLEEP |
82 | # ifndef EV_USE_NANOSLEEP |
83 | # ifndef EV_USE_NANOSLEEP |
83 | # if HAVE_NANOSLEEP |
|
|
84 | # define EV_USE_NANOSLEEP EV_FEATURE_OS |
84 | # define EV_USE_NANOSLEEP EV_FEATURE_OS |
|
|
85 | # endif |
85 | # else |
86 | # else |
|
|
87 | # undef EV_USE_NANOSLEEP |
86 | # define EV_USE_NANOSLEEP 0 |
88 | # define EV_USE_NANOSLEEP 0 |
|
|
89 | # endif |
|
|
90 | |
|
|
91 | # if HAVE_SELECT && HAVE_SYS_SELECT_H |
|
|
92 | # ifndef EV_USE_SELECT |
|
|
93 | # define EV_USE_SELECT EV_FEATURE_BACKENDS |
87 | # endif |
94 | # endif |
|
|
95 | # else |
|
|
96 | # undef EV_USE_SELECT |
|
|
97 | # define EV_USE_SELECT 0 |
88 | # endif |
98 | # endif |
89 | |
99 | |
|
|
100 | # if HAVE_POLL && HAVE_POLL_H |
90 | # ifndef EV_USE_SELECT |
101 | # ifndef EV_USE_POLL |
91 | # if HAVE_SELECT && HAVE_SYS_SELECT_H |
|
|
92 | # define EV_USE_SELECT EV_FEATURE_BACKENDS |
102 | # define EV_USE_POLL EV_FEATURE_BACKENDS |
93 | # else |
|
|
94 | # define EV_USE_SELECT 0 |
|
|
95 | # endif |
103 | # endif |
96 | # endif |
|
|
97 | |
|
|
98 | # ifndef EV_USE_POLL |
|
|
99 | # if HAVE_POLL && HAVE_POLL_H |
|
|
100 | # define EV_USE_POLL EV_FEATURE_BACKENDS |
|
|
101 | # else |
104 | # else |
|
|
105 | # undef EV_USE_POLL |
102 | # define EV_USE_POLL 0 |
106 | # define EV_USE_POLL 0 |
103 | # endif |
|
|
104 | # endif |
107 | # endif |
105 | |
108 | |
106 | # ifndef EV_USE_EPOLL |
|
|
107 | # if HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H |
109 | # if HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H |
|
|
110 | # ifndef EV_USE_EPOLL |
108 | # define EV_USE_EPOLL EV_FEATURE_BACKENDS |
111 | # define EV_USE_EPOLL EV_FEATURE_BACKENDS |
109 | # else |
|
|
110 | # define EV_USE_EPOLL 0 |
|
|
111 | # endif |
112 | # endif |
|
|
113 | # else |
|
|
114 | # undef EV_USE_EPOLL |
|
|
115 | # define EV_USE_EPOLL 0 |
112 | # endif |
116 | # endif |
113 | |
117 | |
114 | # ifndef EV_USE_KQUEUE |
|
|
115 | # if HAVE_KQUEUE && HAVE_SYS_EVENT_H |
118 | # if HAVE_KQUEUE && HAVE_SYS_EVENT_H |
|
|
119 | # ifndef EV_USE_KQUEUE |
116 | # define EV_USE_KQUEUE EV_FEATURE_BACKENDS |
120 | # define EV_USE_KQUEUE EV_FEATURE_BACKENDS |
117 | # else |
|
|
118 | # define EV_USE_KQUEUE 0 |
|
|
119 | # endif |
121 | # endif |
|
|
122 | # else |
|
|
123 | # undef EV_USE_KQUEUE |
|
|
124 | # define EV_USE_KQUEUE 0 |
120 | # endif |
125 | # endif |
121 | |
126 | |
122 | # ifndef EV_USE_PORT |
|
|
123 | # if HAVE_PORT_H && HAVE_PORT_CREATE |
127 | # if HAVE_PORT_H && HAVE_PORT_CREATE |
|
|
128 | # ifndef EV_USE_PORT |
124 | # define EV_USE_PORT EV_FEATURE_BACKENDS |
129 | # define EV_USE_PORT EV_FEATURE_BACKENDS |
125 | # else |
|
|
126 | # define EV_USE_PORT 0 |
|
|
127 | # endif |
130 | # endif |
|
|
131 | # else |
|
|
132 | # undef EV_USE_PORT |
|
|
133 | # define EV_USE_PORT 0 |
128 | # endif |
134 | # endif |
129 | |
135 | |
130 | # ifndef EV_USE_INOTIFY |
|
|
131 | # if HAVE_INOTIFY_INIT && HAVE_SYS_INOTIFY_H |
136 | # if HAVE_INOTIFY_INIT && HAVE_SYS_INOTIFY_H |
|
|
137 | # ifndef EV_USE_INOTIFY |
132 | # define EV_USE_INOTIFY EV_FEATURE_OS |
138 | # define EV_USE_INOTIFY EV_FEATURE_OS |
133 | # else |
|
|
134 | # define EV_USE_INOTIFY 0 |
|
|
135 | # endif |
139 | # endif |
|
|
140 | # else |
|
|
141 | # undef EV_USE_INOTIFY |
|
|
142 | # define EV_USE_INOTIFY 0 |
136 | # endif |
143 | # endif |
137 | |
144 | |
138 | # ifndef EV_USE_SIGNALFD |
|
|
139 | # if HAVE_SIGNALFD && HAVE_SYS_SIGNALFD_H |
145 | # if HAVE_SIGNALFD && HAVE_SYS_SIGNALFD_H |
|
|
146 | # ifndef EV_USE_SIGNALFD |
140 | # define EV_USE_SIGNALFD EV_FEATURE_OS |
147 | # define EV_USE_SIGNALFD EV_FEATURE_OS |
141 | # else |
|
|
142 | # define EV_USE_SIGNALFD 0 |
|
|
143 | # endif |
148 | # endif |
|
|
149 | # else |
|
|
150 | # undef EV_USE_SIGNALFD |
|
|
151 | # define EV_USE_SIGNALFD 0 |
144 | # endif |
152 | # endif |
145 | |
153 | |
|
|
154 | # if HAVE_EVENTFD |
146 | # ifndef EV_USE_EVENTFD |
155 | # ifndef EV_USE_EVENTFD |
147 | # if HAVE_EVENTFD |
|
|
148 | # define EV_USE_EVENTFD EV_FEATURE_OS |
156 | # define EV_USE_EVENTFD EV_FEATURE_OS |
149 | # else |
|
|
150 | # define EV_USE_EVENTFD 0 |
|
|
151 | # endif |
157 | # endif |
|
|
158 | # else |
|
|
159 | # undef EV_USE_EVENTFD |
|
|
160 | # define EV_USE_EVENTFD 0 |
152 | # endif |
161 | # endif |
153 | |
162 | |
154 | #endif |
163 | #endif |
155 | |
164 | |
156 | #include <math.h> |
165 | #include <math.h> |
… | |
… | |
186 | # ifndef EV_SELECT_IS_WINSOCKET |
195 | # ifndef EV_SELECT_IS_WINSOCKET |
187 | # define EV_SELECT_IS_WINSOCKET 1 |
196 | # define EV_SELECT_IS_WINSOCKET 1 |
188 | # endif |
197 | # endif |
189 | # undef EV_AVOID_STDIO |
198 | # undef EV_AVOID_STDIO |
190 | #endif |
199 | #endif |
|
|
200 | |
|
|
201 | /* OS X, in its infinite idiocy, actually HARDCODES |
|
|
202 | * a limit of 1024 into their select. Where people have brains, |
|
|
203 | * OS X engineers apparently have a vacuum. Or maybe they were |
|
|
204 | * ordered to have a vacuum, or they do anything for money. |
|
|
205 | * This might help. Or not. |
|
|
206 | */ |
|
|
207 | #define _DARWIN_UNLIMITED_SELECT 1 |
191 | |
208 | |
192 | /* this block tries to deduce configuration from header-defined symbols and defaults */ |
209 | /* this block tries to deduce configuration from header-defined symbols and defaults */ |
193 | |
210 | |
194 | /* try to deduce the maximum number of signals on this platform */ |
211 | /* try to deduce the maximum number of signals on this platform */ |
195 | #if defined (EV_NSIG) |
212 | #if defined (EV_NSIG) |
… | |
… | |
494 | #define ev_active(w) ((W)(w))->active |
511 | #define ev_active(w) ((W)(w))->active |
495 | #define ev_at(w) ((WT)(w))->at |
512 | #define ev_at(w) ((WT)(w))->at |
496 | |
513 | |
497 | #if EV_USE_REALTIME |
514 | #if EV_USE_REALTIME |
498 | /* sig_atomic_t is used to avoid per-thread variables or locking but still */ |
515 | /* sig_atomic_t is used to avoid per-thread variables or locking but still */ |
499 | /* giving it a reasonably high chance of working on typical architetcures */ |
516 | /* giving it a reasonably high chance of working on typical architectures */ |
500 | static EV_ATOMIC_T have_realtime; /* did clock_gettime (CLOCK_REALTIME) work? */ |
517 | static EV_ATOMIC_T have_realtime; /* did clock_gettime (CLOCK_REALTIME) work? */ |
501 | #endif |
518 | #endif |
502 | |
519 | |
503 | #if EV_USE_MONOTONIC |
520 | #if EV_USE_MONOTONIC |
504 | static EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */ |
521 | static EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */ |
… | |
… | |
777 | /*****************************************************************************/ |
794 | /*****************************************************************************/ |
778 | |
795 | |
779 | #define MALLOC_ROUND 4096 /* prefer to allocate in chunks of this size, must be 2**n and >> 4 longs */ |
796 | #define MALLOC_ROUND 4096 /* prefer to allocate in chunks of this size, must be 2**n and >> 4 longs */ |
780 | |
797 | |
781 | /* find a suitable new size for the given array, */ |
798 | /* find a suitable new size for the given array, */ |
782 | /* hopefully by rounding to a ncie-to-malloc size */ |
799 | /* hopefully by rounding to a nice-to-malloc size */ |
783 | inline_size int |
800 | inline_size int |
784 | array_nextsize (int elem, int cur, int cnt) |
801 | array_nextsize (int elem, int cur, int cnt) |
785 | { |
802 | { |
786 | int ncur = cur + 1; |
803 | int ncur = cur + 1; |
787 | |
804 | |
… | |
… | |
1054 | } |
1071 | } |
1055 | |
1072 | |
1056 | /*****************************************************************************/ |
1073 | /*****************************************************************************/ |
1057 | |
1074 | |
1058 | /* |
1075 | /* |
1059 | * the heap functions want a real array index. array index 0 uis guaranteed to not |
1076 | * the heap functions want a real array index. array index 0 is guaranteed to not |
1060 | * be in-use at any time. the first heap entry is at array [HEAP0]. DHEAP gives |
1077 | * be in-use at any time. the first heap entry is at array [HEAP0]. DHEAP gives |
1061 | * the branching factor of the d-tree. |
1078 | * the branching factor of the d-tree. |
1062 | */ |
1079 | */ |
1063 | |
1080 | |
1064 | /* |
1081 | /* |
… | |
… | |
1264 | uint64_t counter = 1; |
1281 | uint64_t counter = 1; |
1265 | write (evfd, &counter, sizeof (uint64_t)); |
1282 | write (evfd, &counter, sizeof (uint64_t)); |
1266 | } |
1283 | } |
1267 | else |
1284 | else |
1268 | #endif |
1285 | #endif |
|
|
1286 | /* win32 people keep sending patches that change this write() to send() */ |
|
|
1287 | /* and then run away. but send() is wrong, it wants a socket handle on win32 */ |
|
|
1288 | /* so when you think this write should be a send instead, please find out */ |
|
|
1289 | /* where your send() is from - it's definitely not the microsoft send, and */ |
|
|
1290 | /* tell me. thank you. */ |
1269 | write (evpipe [1], &dummy, 1); |
1291 | write (evpipe [1], &dummy, 1); |
1270 | |
1292 | |
1271 | errno = old_errno; |
1293 | errno = old_errno; |
1272 | } |
1294 | } |
1273 | } |
1295 | } |
… | |
… | |
1287 | } |
1309 | } |
1288 | else |
1310 | else |
1289 | #endif |
1311 | #endif |
1290 | { |
1312 | { |
1291 | char dummy; |
1313 | char dummy; |
|
|
1314 | /* see discussion in evpipe_write when you think this read should be recv in win32 */ |
1292 | read (evpipe [0], &dummy, 1); |
1315 | read (evpipe [0], &dummy, 1); |
1293 | } |
1316 | } |
1294 | |
1317 | |
1295 | if (sig_pending) |
1318 | if (sig_pending) |
1296 | { |
1319 | { |
… | |
… | |
1507 | #ifdef __APPLE__ |
1530 | #ifdef __APPLE__ |
1508 | /* only select works correctly on that "unix-certified" platform */ |
1531 | /* only select works correctly on that "unix-certified" platform */ |
1509 | flags &= ~EVBACKEND_KQUEUE; /* horribly broken, even for sockets */ |
1532 | flags &= ~EVBACKEND_KQUEUE; /* horribly broken, even for sockets */ |
1510 | flags &= ~EVBACKEND_POLL; /* poll is based on kqueue from 10.5 onwards */ |
1533 | flags &= ~EVBACKEND_POLL; /* poll is based on kqueue from 10.5 onwards */ |
1511 | #endif |
1534 | #endif |
|
|
1535 | #ifdef __FreeBSD__ |
|
|
1536 | flags &= ~EVBACKEND_POLL; /* poll return value is unusable (http://forums.freebsd.org/archive/index.php/t-10270.html) */ |
|
|
1537 | #endif |
1512 | |
1538 | |
1513 | return flags; |
1539 | return flags; |
1514 | } |
1540 | } |
1515 | |
1541 | |
1516 | unsigned int |
1542 | unsigned int |
… | |
… | |
2096 | EV_FREQUENT_CHECK; |
2122 | EV_FREQUENT_CHECK; |
2097 | feed_reverse (EV_A_ (W)w); |
2123 | feed_reverse (EV_A_ (W)w); |
2098 | } |
2124 | } |
2099 | while (timercnt && ANHE_at (timers [HEAP0]) < mn_now); |
2125 | while (timercnt && ANHE_at (timers [HEAP0]) < mn_now); |
2100 | |
2126 | |
2101 | feed_reverse_done (EV_A_ EV_TIMEOUT); |
2127 | feed_reverse_done (EV_A_ EV_TIMER); |
2102 | } |
2128 | } |
2103 | } |
2129 | } |
2104 | |
2130 | |
2105 | #if EV_PERIODIC_ENABLE |
2131 | #if EV_PERIODIC_ENABLE |
2106 | /* make periodics pending */ |
2132 | /* make periodics pending */ |
… | |
… | |
2159 | feed_reverse_done (EV_A_ EV_PERIODIC); |
2185 | feed_reverse_done (EV_A_ EV_PERIODIC); |
2160 | } |
2186 | } |
2161 | } |
2187 | } |
2162 | |
2188 | |
2163 | /* simply recalculate all periodics */ |
2189 | /* simply recalculate all periodics */ |
2164 | /* TODO: maybe ensure that at leats one event happens when jumping forward? */ |
2190 | /* TODO: maybe ensure that at least one event happens when jumping forward? */ |
2165 | static void noinline |
2191 | static void noinline |
2166 | periodics_reschedule (EV_P) |
2192 | periodics_reschedule (EV_P) |
2167 | { |
2193 | { |
2168 | int i; |
2194 | int i; |
2169 | |
2195 | |
… | |
… | |
3636 | { |
3662 | { |
3637 | struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once)); |
3663 | struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once)); |
3638 | |
3664 | |
3639 | if (expect_false (!once)) |
3665 | if (expect_false (!once)) |
3640 | { |
3666 | { |
3641 | cb (EV_ERROR | EV_READ | EV_WRITE | EV_TIMEOUT, arg); |
3667 | cb (EV_ERROR | EV_READ | EV_WRITE | EV_TIMER, arg); |
3642 | return; |
3668 | return; |
3643 | } |
3669 | } |
3644 | |
3670 | |
3645 | once->cb = cb; |
3671 | once->cb = cb; |
3646 | once->arg = arg; |
3672 | once->arg = arg; |