libev_scheduler 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +25 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +1 -1
- data/README.md +201 -2
- data/ext/libev/Changes +71 -2
- data/ext/libev/ev.c +625 -201
- data/ext/libev/ev.h +25 -22
- data/ext/libev/ev_epoll.c +16 -14
- data/ext/libev/ev_iouring.c +694 -0
- data/ext/libev/ev_kqueue.c +4 -4
- data/ext/libev/ev_linuxaio.c +78 -100
- data/ext/libev/ev_poll.c +6 -6
- data/ext/libev/ev_port.c +3 -3
- data/ext/libev/ev_select.c +6 -6
- data/ext/libev/ev_vars.h +34 -0
- data/ext/libev/ev_win32.c +2 -2
- data/ext/libev/ev_wrap.h +56 -0
- data/lib/libev_scheduler/version.rb +1 -1
- metadata +4 -3
- data/.github/test.yml +0 -31
data/ext/libev/ev_kqueue.c
CHANGED
@@ -103,7 +103,7 @@ kqueue_poll (EV_P_ ev_tstamp timeout)
|
|
103
103
|
EV_ACQUIRE_CB;
|
104
104
|
kqueue_changecnt = 0;
|
105
105
|
|
106
|
-
if (
|
106
|
+
if (ecb_expect_false (res < 0))
|
107
107
|
{
|
108
108
|
if (errno != EINTR)
|
109
109
|
ev_syserr ("(libev) kqueue kevent");
|
@@ -115,7 +115,7 @@ kqueue_poll (EV_P_ ev_tstamp timeout)
|
|
115
115
|
{
|
116
116
|
int fd = kqueue_events [i].ident;
|
117
117
|
|
118
|
-
if (
|
118
|
+
if (ecb_expect_false (kqueue_events [i].flags & EV_ERROR))
|
119
119
|
{
|
120
120
|
int err = kqueue_events [i].data;
|
121
121
|
|
@@ -151,7 +151,7 @@ kqueue_poll (EV_P_ ev_tstamp timeout)
|
|
151
151
|
);
|
152
152
|
}
|
153
153
|
|
154
|
-
if (
|
154
|
+
if (ecb_expect_false (res == kqueue_eventmax))
|
155
155
|
{
|
156
156
|
ev_free (kqueue_events);
|
157
157
|
kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_eventmax + 1);
|
@@ -170,7 +170,7 @@ kqueue_init (EV_P_ int flags)
|
|
170
170
|
|
171
171
|
fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */
|
172
172
|
|
173
|
-
backend_mintime = 1e-9; /* apparently, they did the right thing in freebsd */
|
173
|
+
backend_mintime = EV_TS_CONST (1e-9); /* apparently, they did the right thing in freebsd */
|
174
174
|
backend_modify = kqueue_modify;
|
175
175
|
backend_poll = kqueue_poll;
|
176
176
|
|
data/ext/libev/ev_linuxaio.c
CHANGED
@@ -118,57 +118,6 @@ struct aio_ring
|
|
118
118
|
struct io_event io_events[0];
|
119
119
|
};
|
120
120
|
|
121
|
-
/*
|
122
|
-
* define some syscall wrappers for common architectures
|
123
|
-
* this is mostly for nice looks during debugging, not performance.
|
124
|
-
* our syscalls return < 0, not == -1, on error. which is good
|
125
|
-
* enough for linux aio.
|
126
|
-
* TODO: arm is also common nowadays, maybe even mips and x86
|
127
|
-
* TODO: after implementing this, it suddenly looks like overkill, but its hard to remove...
|
128
|
-
*/
|
129
|
-
#if __GNUC__ && __linux && ECB_AMD64 && !defined __OPTIMIZE_SIZE__
|
130
|
-
/* the costly errno access probably kills this for size optimisation */
|
131
|
-
|
132
|
-
#define ev_syscall(nr,narg,arg1,arg2,arg3,arg4,arg5) \
|
133
|
-
({ \
|
134
|
-
long res; \
|
135
|
-
register unsigned long r5 __asm__ ("r8" ); \
|
136
|
-
register unsigned long r4 __asm__ ("r10"); \
|
137
|
-
register unsigned long r3 __asm__ ("rdx"); \
|
138
|
-
register unsigned long r2 __asm__ ("rsi"); \
|
139
|
-
register unsigned long r1 __asm__ ("rdi"); \
|
140
|
-
if (narg >= 5) r5 = (unsigned long)(arg5); \
|
141
|
-
if (narg >= 4) r4 = (unsigned long)(arg4); \
|
142
|
-
if (narg >= 3) r3 = (unsigned long)(arg3); \
|
143
|
-
if (narg >= 2) r2 = (unsigned long)(arg2); \
|
144
|
-
if (narg >= 1) r1 = (unsigned long)(arg1); \
|
145
|
-
__asm__ __volatile__ ( \
|
146
|
-
"syscall\n\t" \
|
147
|
-
: "=a" (res) \
|
148
|
-
: "0" (nr), "r" (r1), "r" (r2), "r" (r3), "r" (r4), "r" (r5) \
|
149
|
-
: "cc", "r11", "cx", "memory"); \
|
150
|
-
errno = -res; \
|
151
|
-
res; \
|
152
|
-
})
|
153
|
-
|
154
|
-
#endif
|
155
|
-
|
156
|
-
#ifdef ev_syscall
|
157
|
-
#define ev_syscall0(nr) ev_syscall (nr, 0, 0, 0, 0, 0, 0
|
158
|
-
#define ev_syscall1(nr,arg1) ev_syscall (nr, 1, arg1, 0, 0, 0, 0)
|
159
|
-
#define ev_syscall2(nr,arg1,arg2) ev_syscall (nr, 2, arg1, arg2, 0, 0, 0)
|
160
|
-
#define ev_syscall3(nr,arg1,arg2,arg3) ev_syscall (nr, 3, arg1, arg2, arg3, 0, 0)
|
161
|
-
#define ev_syscall4(nr,arg1,arg2,arg3,arg4) ev_syscall (nr, 3, arg1, arg2, arg3, arg4, 0)
|
162
|
-
#define ev_syscall5(nr,arg1,arg2,arg3,arg4,arg5) ev_syscall (nr, 5, arg1, arg2, arg3, arg4, arg5)
|
163
|
-
#else
|
164
|
-
#define ev_syscall0(nr) syscall (nr)
|
165
|
-
#define ev_syscall1(nr,arg1) syscall (nr, arg1)
|
166
|
-
#define ev_syscall2(nr,arg1,arg2) syscall (nr, arg1, arg2)
|
167
|
-
#define ev_syscall3(nr,arg1,arg2,arg3) syscall (nr, arg1, arg2, arg3)
|
168
|
-
#define ev_syscall4(nr,arg1,arg2,arg3,arg4) syscall (nr, arg1, arg2, arg3, arg4)
|
169
|
-
#define ev_syscall5(nr,arg1,arg2,arg3,arg4,arg5) syscall (nr, arg1, arg2, arg3, arg4, arg5)
|
170
|
-
#endif
|
171
|
-
|
172
121
|
inline_size
|
173
122
|
int
|
174
123
|
evsys_io_setup (unsigned nr_events, aio_context_t *ctx_idp)
|
@@ -265,7 +214,6 @@ linuxaio_array_needsize_iocbp (ANIOCBP *base, int offset, int count)
|
|
265
214
|
memset (iocb, 0, sizeof (*iocb));
|
266
215
|
|
267
216
|
iocb->io.aio_lio_opcode = IOCB_CMD_POLL;
|
268
|
-
iocb->io.aio_data = offset;
|
269
217
|
iocb->io.aio_fildes = offset;
|
270
218
|
|
271
219
|
base [offset++] = iocb;
|
@@ -287,28 +235,47 @@ linuxaio_modify (EV_P_ int fd, int oev, int nev)
|
|
287
235
|
{
|
288
236
|
array_needsize (ANIOCBP, linuxaio_iocbps, linuxaio_iocbpmax, fd + 1, linuxaio_array_needsize_iocbp);
|
289
237
|
ANIOCBP iocb = linuxaio_iocbps [fd];
|
238
|
+
ANFD *anfd = &anfds [fd];
|
290
239
|
|
291
|
-
if (iocb->io.aio_reqprio < 0)
|
240
|
+
if (ecb_expect_false (iocb->io.aio_reqprio < 0))
|
292
241
|
{
|
293
242
|
/* we handed this fd over to epoll, so undo this first */
|
294
243
|
/* we do it manually because the optimisations on epoll_modify won't do us any good */
|
295
244
|
epoll_ctl (backend_fd, EPOLL_CTL_DEL, fd, 0);
|
296
|
-
|
245
|
+
anfd->emask = 0;
|
297
246
|
iocb->io.aio_reqprio = 0;
|
298
247
|
}
|
299
|
-
|
300
|
-
if (iocb->io.aio_buf)
|
248
|
+
else if (ecb_expect_false (iocb->io.aio_buf))
|
301
249
|
{
|
302
|
-
|
303
|
-
/*
|
304
|
-
|
250
|
+
/* iocb active, so cancel it first before resubmit */
|
251
|
+
/* this assumes we only ever get one call per fd per loop iteration */
|
252
|
+
for (;;)
|
253
|
+
{
|
254
|
+
/* on all relevant kernels, io_cancel fails with EINPROGRESS on "success" */
|
255
|
+
if (ecb_expect_false (evsys_io_cancel (linuxaio_ctx, &iocb->io, (struct io_event *)0) == 0))
|
256
|
+
break;
|
257
|
+
|
258
|
+
if (ecb_expect_true (errno == EINPROGRESS))
|
259
|
+
break;
|
260
|
+
|
261
|
+
/* the EINPROGRESS test is for nicer error message. clumsy. */
|
262
|
+
if (errno != EINTR)
|
263
|
+
{
|
264
|
+
assert (("libev: linuxaio unexpected io_cancel failed", errno != EINTR && errno != EINPROGRESS));
|
265
|
+
break;
|
266
|
+
}
|
267
|
+
}
|
268
|
+
|
269
|
+
/* increment generation counter to avoid handling old events */
|
270
|
+
++anfd->egen;
|
305
271
|
}
|
306
272
|
|
273
|
+
iocb->io.aio_buf = (nev & EV_READ ? POLLIN : 0)
|
274
|
+
| (nev & EV_WRITE ? POLLOUT : 0);
|
275
|
+
|
307
276
|
if (nev)
|
308
277
|
{
|
309
|
-
iocb->io.
|
310
|
-
(nev & EV_READ ? POLLIN : 0)
|
311
|
-
| (nev & EV_WRITE ? POLLOUT : 0);
|
278
|
+
iocb->io.aio_data = (uint32_t)fd | ((__u64)(uint32_t)anfd->egen << 32);
|
312
279
|
|
313
280
|
/* queue iocb up for io_submit */
|
314
281
|
/* this assumes we only ever get one call per fd per loop iteration */
|
@@ -338,21 +305,26 @@ linuxaio_parse_events (EV_P_ struct io_event *ev, int nr)
|
|
338
305
|
{
|
339
306
|
while (nr)
|
340
307
|
{
|
341
|
-
int fd
|
342
|
-
|
308
|
+
int fd = ev->data & 0xffffffff;
|
309
|
+
uint32_t gen = ev->data >> 32;
|
310
|
+
int res = ev->res;
|
343
311
|
|
344
312
|
assert (("libev: iocb fd must be in-bounds", fd >= 0 && fd < anfdmax));
|
345
313
|
|
346
|
-
/*
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
314
|
+
/* only accept events if generation counter matches */
|
315
|
+
if (ecb_expect_true (gen == (uint32_t)anfds [fd].egen))
|
316
|
+
{
|
317
|
+
/* feed events, we do not expect or handle POLLNVAL */
|
318
|
+
fd_event (
|
319
|
+
EV_A_
|
320
|
+
fd,
|
321
|
+
(res & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0)
|
322
|
+
| (res & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0)
|
323
|
+
);
|
324
|
+
|
325
|
+
/* linux aio is oneshot: rearm fd. TODO: this does more work than strictly needed */
|
326
|
+
linuxaio_fd_rearm (EV_A_ fd);
|
327
|
+
}
|
356
328
|
|
357
329
|
--nr;
|
358
330
|
++ev;
|
@@ -364,21 +336,20 @@ static int
|
|
364
336
|
linuxaio_get_events_from_ring (EV_P)
|
365
337
|
{
|
366
338
|
struct aio_ring *ring = (struct aio_ring *)linuxaio_ctx;
|
339
|
+
unsigned head, tail;
|
367
340
|
|
368
341
|
/* the kernel reads and writes both of these variables, */
|
369
342
|
/* as a C extension, we assume that volatile use here */
|
370
343
|
/* both makes reads atomic and once-only */
|
371
|
-
|
372
|
-
|
344
|
+
head = *(volatile unsigned *)&ring->head;
|
345
|
+
ECB_MEMORY_FENCE_ACQUIRE;
|
346
|
+
tail = *(volatile unsigned *)&ring->tail;
|
373
347
|
|
374
348
|
if (head == tail)
|
375
349
|
return 0;
|
376
350
|
|
377
|
-
/* make sure the events up to tail are visible */
|
378
|
-
ECB_MEMORY_FENCE_ACQUIRE;
|
379
|
-
|
380
351
|
/* parse all available events, but only once, to avoid starvation */
|
381
|
-
if (tail > head) /* normal case around */
|
352
|
+
if (ecb_expect_true (tail > head)) /* normal case around */
|
382
353
|
linuxaio_parse_events (EV_A_ ring->io_events + head, tail - head);
|
383
354
|
else /* wrapped around */
|
384
355
|
{
|
@@ -399,7 +370,7 @@ linuxaio_ringbuf_valid (EV_P)
|
|
399
370
|
{
|
400
371
|
struct aio_ring *ring = (struct aio_ring *)linuxaio_ctx;
|
401
372
|
|
402
|
-
return
|
373
|
+
return ecb_expect_true (ring->magic == AIO_RING_MAGIC)
|
403
374
|
&& ring->incompat_features == EV_AIO_RING_INCOMPAT_FEATURES
|
404
375
|
&& ring->header_length == sizeof (struct aio_ring); /* TODO: or use it to find io_event[0]? */
|
405
376
|
}
|
@@ -414,7 +385,7 @@ linuxaio_get_events (EV_P_ ev_tstamp timeout)
|
|
414
385
|
int want = 1; /* how many events to request */
|
415
386
|
int ringbuf_valid = linuxaio_ringbuf_valid (EV_A);
|
416
387
|
|
417
|
-
if (
|
388
|
+
if (ecb_expect_true (ringbuf_valid))
|
418
389
|
{
|
419
390
|
/* if the ring buffer has any events, we don't wait or call the kernel at all */
|
420
391
|
if (linuxaio_get_events_from_ring (EV_A))
|
@@ -437,9 +408,7 @@ linuxaio_get_events (EV_P_ ev_tstamp timeout)
|
|
437
408
|
|
438
409
|
EV_RELEASE_CB;
|
439
410
|
|
440
|
-
ts
|
441
|
-
ts.tv_nsec = (long)((timeout - ts.tv_sec) * 1e9);
|
442
|
-
|
411
|
+
EV_TS_SET (ts, timeout);
|
443
412
|
res = evsys_io_getevents (linuxaio_ctx, 1, want, ioev, &ts);
|
444
413
|
|
445
414
|
EV_ACQUIRE_CB;
|
@@ -454,7 +423,7 @@ linuxaio_get_events (EV_P_ ev_tstamp timeout)
|
|
454
423
|
/* at least one event available, handle them */
|
455
424
|
linuxaio_parse_events (EV_A_ ioev, res);
|
456
425
|
|
457
|
-
if (
|
426
|
+
if (ecb_expect_true (ringbuf_valid))
|
458
427
|
{
|
459
428
|
/* if we have a ring buffer, handle any remaining events in it */
|
460
429
|
linuxaio_get_events_from_ring (EV_A);
|
@@ -469,7 +438,7 @@ linuxaio_get_events (EV_P_ ev_tstamp timeout)
|
|
469
438
|
else
|
470
439
|
break; /* no events from the kernel, we are done */
|
471
440
|
|
472
|
-
timeout = 0; /* only wait in the first iteration */
|
441
|
+
timeout = EV_TS_CONST (0.); /* only wait in the first iteration */
|
473
442
|
}
|
474
443
|
}
|
475
444
|
|
@@ -495,7 +464,7 @@ linuxaio_poll (EV_P_ ev_tstamp timeout)
|
|
495
464
|
{
|
496
465
|
int res = evsys_io_submit (linuxaio_ctx, linuxaio_submitcnt - submitted, linuxaio_submits + submitted);
|
497
466
|
|
498
|
-
if (
|
467
|
+
if (ecb_expect_false (res < 0))
|
499
468
|
if (errno == EINVAL)
|
500
469
|
{
|
501
470
|
/* This happens for unsupported fds, officially, but in my testing,
|
@@ -535,16 +504,21 @@ linuxaio_poll (EV_P_ ev_tstamp timeout)
|
|
535
504
|
++linuxaio_iteration;
|
536
505
|
if (linuxaio_io_setup (EV_A) < 0)
|
537
506
|
{
|
507
|
+
/* TODO: rearm all and recreate epoll backend from scratch */
|
508
|
+
/* TODO: might be more prudent? */
|
509
|
+
|
538
510
|
/* to bad, we can't get a new aio context, go 100% epoll */
|
539
511
|
linuxaio_free_iocbp (EV_A);
|
540
512
|
ev_io_stop (EV_A_ &linuxaio_epoll_w);
|
541
513
|
ev_ref (EV_A);
|
542
514
|
linuxaio_ctx = 0;
|
515
|
+
|
516
|
+
backend = EVBACKEND_EPOLL;
|
543
517
|
backend_modify = epoll_modify;
|
544
518
|
backend_poll = epoll_poll;
|
545
519
|
}
|
546
520
|
|
547
|
-
timeout = 0;
|
521
|
+
timeout = EV_TS_CONST (0.);
|
548
522
|
/* it's easiest to handle this mess in another iteration */
|
549
523
|
return;
|
550
524
|
}
|
@@ -555,8 +529,13 @@ linuxaio_poll (EV_P_ ev_tstamp timeout)
|
|
555
529
|
|
556
530
|
res = 1; /* skip this iocb */
|
557
531
|
}
|
532
|
+
else if (errno == EINTR) /* not seen in reality, not documented */
|
533
|
+
res = 0; /* silently ignore and retry */
|
558
534
|
else
|
559
|
-
|
535
|
+
{
|
536
|
+
ev_syserr ("(libev) linuxaio io_submit");
|
537
|
+
res = 0;
|
538
|
+
}
|
560
539
|
|
561
540
|
submitted += res;
|
562
541
|
}
|
@@ -589,13 +568,13 @@ linuxaio_init (EV_P_ int flags)
|
|
589
568
|
return 0;
|
590
569
|
}
|
591
570
|
|
592
|
-
ev_io_init (
|
571
|
+
ev_io_init (&linuxaio_epoll_w, linuxaio_epoll_cb, backend_fd, EV_READ);
|
593
572
|
ev_set_priority (&linuxaio_epoll_w, EV_MAXPRI);
|
594
573
|
ev_io_start (EV_A_ &linuxaio_epoll_w);
|
595
574
|
ev_unref (EV_A); /* watcher should not keep loop alive */
|
596
575
|
|
597
|
-
backend_modify
|
598
|
-
backend_poll
|
576
|
+
backend_modify = linuxaio_modify;
|
577
|
+
backend_poll = linuxaio_poll;
|
599
578
|
|
600
579
|
linuxaio_iocbpmax = 0;
|
601
580
|
linuxaio_iocbps = 0;
|
@@ -616,13 +595,13 @@ linuxaio_destroy (EV_P)
|
|
616
595
|
evsys_io_destroy (linuxaio_ctx); /* fails in child, aio context is destroyed */
|
617
596
|
}
|
618
597
|
|
619
|
-
|
620
|
-
void
|
598
|
+
ecb_cold
|
599
|
+
static void
|
621
600
|
linuxaio_fork (EV_P)
|
622
601
|
{
|
623
|
-
/* this frees all iocbs, which is very heavy-handed */
|
624
|
-
linuxaio_destroy (EV_A);
|
625
602
|
linuxaio_submitcnt = 0; /* all pointers were invalidated */
|
603
|
+
linuxaio_free_iocbp (EV_A); /* this frees all iocbs, which is very heavy-handed */
|
604
|
+
evsys_io_destroy (linuxaio_ctx); /* fails in child, aio context is destroyed */
|
626
605
|
|
627
606
|
linuxaio_iteration = 0; /* we start over in the child */
|
628
607
|
|
@@ -631,12 +610,11 @@ linuxaio_fork (EV_P)
|
|
631
610
|
|
632
611
|
/* forking epoll should also effectively unregister all fds from the backend */
|
633
612
|
epoll_fork (EV_A);
|
613
|
+
/* epoll_fork already did this. hopefully */
|
614
|
+
/*fd_rearm_all (EV_A);*/
|
634
615
|
|
635
616
|
ev_io_stop (EV_A_ &linuxaio_epoll_w);
|
636
617
|
ev_io_set (EV_A_ &linuxaio_epoll_w, backend_fd, EV_READ);
|
637
618
|
ev_io_start (EV_A_ &linuxaio_epoll_w);
|
638
|
-
|
639
|
-
/* epoll_fork already did this. hopefully */
|
640
|
-
/*fd_rearm_all (EV_A);*/
|
641
619
|
}
|
642
620
|
|
data/ext/libev/ev_poll.c
CHANGED
@@ -80,7 +80,7 @@ poll_modify (EV_P_ int fd, int oev, int nev)
|
|
80
80
|
{
|
81
81
|
pollidxs [fd] = -1;
|
82
82
|
|
83
|
-
if (
|
83
|
+
if (ecb_expect_true (idx < --pollcnt))
|
84
84
|
{
|
85
85
|
polls [idx] = polls [pollcnt];
|
86
86
|
pollidxs [polls [idx].fd] = idx;
|
@@ -95,10 +95,10 @@ poll_poll (EV_P_ ev_tstamp timeout)
|
|
95
95
|
int res;
|
96
96
|
|
97
97
|
EV_RELEASE_CB;
|
98
|
-
res = poll (polls, pollcnt, timeout
|
98
|
+
res = poll (polls, pollcnt, EV_TS_TO_MSEC (timeout));
|
99
99
|
EV_ACQUIRE_CB;
|
100
100
|
|
101
|
-
if (
|
101
|
+
if (ecb_expect_false (res < 0))
|
102
102
|
{
|
103
103
|
if (errno == EBADF)
|
104
104
|
fd_ebadf (EV_A);
|
@@ -112,11 +112,11 @@ poll_poll (EV_P_ ev_tstamp timeout)
|
|
112
112
|
{
|
113
113
|
assert (("libev: poll returned illegal result, broken BSD kernel?", p < polls + pollcnt));
|
114
114
|
|
115
|
-
if (
|
115
|
+
if (ecb_expect_false (p->revents)) /* this expect is debatable */
|
116
116
|
{
|
117
117
|
--res;
|
118
118
|
|
119
|
-
if (
|
119
|
+
if (ecb_expect_false (p->revents & POLLNVAL))
|
120
120
|
{
|
121
121
|
assert (("libev: poll found invalid fd in poll set", 0));
|
122
122
|
fd_kill (EV_A_ p->fd);
|
@@ -136,7 +136,7 @@ inline_size
|
|
136
136
|
int
|
137
137
|
poll_init (EV_P_ int flags)
|
138
138
|
{
|
139
|
-
backend_mintime = 1e-3;
|
139
|
+
backend_mintime = EV_TS_CONST (1e-3);
|
140
140
|
backend_modify = poll_modify;
|
141
141
|
backend_poll = poll_poll;
|
142
142
|
|
data/ext/libev/ev_port.c
CHANGED
@@ -132,7 +132,7 @@ port_poll (EV_P_ ev_tstamp timeout)
|
|
132
132
|
}
|
133
133
|
}
|
134
134
|
|
135
|
-
if (
|
135
|
+
if (ecb_expect_false (nget == port_eventmax))
|
136
136
|
{
|
137
137
|
ev_free (port_events);
|
138
138
|
port_eventmax = array_nextsize (sizeof (port_event_t), port_eventmax, port_eventmax + 1);
|
@@ -154,11 +154,11 @@ port_init (EV_P_ int flags)
|
|
154
154
|
|
155
155
|
/* if my reading of the opensolaris kernel sources are correct, then
|
156
156
|
* opensolaris does something very stupid: it checks if the time has already
|
157
|
-
* elapsed and doesn't round up if that is the case,
|
157
|
+
* elapsed and doesn't round up if that is the case, otherwise it DOES round
|
158
158
|
* up. Since we can't know what the case is, we need to guess by using a
|
159
159
|
* "large enough" timeout. Normally, 1e-9 would be correct.
|
160
160
|
*/
|
161
|
-
backend_mintime = 1e-3; /* needed to compensate for port_getn returning early */
|
161
|
+
backend_mintime = EV_TS_CONST (1e-3); /* needed to compensate for port_getn returning early */
|
162
162
|
backend_modify = port_modify;
|
163
163
|
backend_poll = port_poll;
|
164
164
|
|
data/ext/libev/ev_select.c
CHANGED
@@ -108,7 +108,7 @@ select_modify (EV_P_ int fd, int oev, int nev)
|
|
108
108
|
int word = fd / NFDBITS;
|
109
109
|
fd_mask mask = 1UL << (fd % NFDBITS);
|
110
110
|
|
111
|
-
if (
|
111
|
+
if (ecb_expect_false (vec_max <= word))
|
112
112
|
{
|
113
113
|
int new_max = word + 1;
|
114
114
|
|
@@ -171,7 +171,7 @@ select_poll (EV_P_ ev_tstamp timeout)
|
|
171
171
|
#endif
|
172
172
|
EV_ACQUIRE_CB;
|
173
173
|
|
174
|
-
if (
|
174
|
+
if (ecb_expect_false (res < 0))
|
175
175
|
{
|
176
176
|
#if EV_SELECT_IS_WINSOCKET
|
177
177
|
errno = WSAGetLastError ();
|
@@ -197,7 +197,7 @@ select_poll (EV_P_ ev_tstamp timeout)
|
|
197
197
|
{
|
198
198
|
if (timeout)
|
199
199
|
{
|
200
|
-
unsigned long ms = timeout
|
200
|
+
unsigned long ms = EV_TS_TO_MSEC (timeout);
|
201
201
|
Sleep (ms ? ms : 1);
|
202
202
|
}
|
203
203
|
|
@@ -236,7 +236,7 @@ select_poll (EV_P_ ev_tstamp timeout)
|
|
236
236
|
if (FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE;
|
237
237
|
#endif
|
238
238
|
|
239
|
-
if (
|
239
|
+
if (ecb_expect_true (events))
|
240
240
|
fd_event (EV_A_ fd, events);
|
241
241
|
}
|
242
242
|
}
|
@@ -262,7 +262,7 @@ select_poll (EV_P_ ev_tstamp timeout)
|
|
262
262
|
events |= word_r & mask ? EV_READ : 0;
|
263
263
|
events |= word_w & mask ? EV_WRITE : 0;
|
264
264
|
|
265
|
-
if (
|
265
|
+
if (ecb_expect_true (events))
|
266
266
|
fd_event (EV_A_ word * NFDBITS + bit, events);
|
267
267
|
}
|
268
268
|
}
|
@@ -275,7 +275,7 @@ inline_size
|
|
275
275
|
int
|
276
276
|
select_init (EV_P_ int flags)
|
277
277
|
{
|
278
|
-
backend_mintime = 1e-6;
|
278
|
+
backend_mintime = EV_TS_CONST (1e-6);
|
279
279
|
backend_modify = select_modify;
|
280
280
|
backend_poll = select_poll;
|
281
281
|
|