io-event 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/IO_Event.bundle +0 -0
- data/ext/io/event/selector/epoll.c +10 -2
- data/ext/io/event/selector/kqueue.c +10 -2
- data/ext/io/event/selector/uring.c +22 -8
- data/ext/kqueue.o +0 -0
- data/lib/io/event/selector.rb +2 -4
- data/lib/io/event/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82ae60c9c790437fc720a98489a0edcc345cca0420d795b2e33dcd8729f30dd2
|
4
|
+
data.tar.gz: f1a585938bb11cab9dd29a5acb50831feadce6e60d515112d2e8b22fdda5f65b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34578267eccd7ae7c7c902f44db64f2be4a63e596c4c4522ed2199a5fd4c1247f1bcf31b02b0b2c21a8aa2856979c45421f86a01f0fbd32b824f5df91dd1ab7f
|
7
|
+
data.tar.gz: 3d4f4acd7739cc67c04e65c4a6f4079bd0d887c50cbb13f0d979b4d7f7f94916dc6067f93a33b8a63c67cae45b0f0743c2b9f4af4e46b1e33a7397910026ee86
|
data/ext/IO_Event.bundle
CHANGED
Binary file
|
@@ -540,7 +540,11 @@ void select_internal_without_gvl(struct select_arguments *arguments) {
|
|
540
540
|
arguments->data->blocked = 0;
|
541
541
|
|
542
542
|
if (arguments->count == -1) {
|
543
|
-
|
543
|
+
if (errno != EINTR) {
|
544
|
+
rb_sys_fail("select_internal_without_gvl:epoll_wait");
|
545
|
+
} else {
|
546
|
+
arguments->count = 0;
|
547
|
+
}
|
544
548
|
}
|
545
549
|
}
|
546
550
|
|
@@ -549,7 +553,11 @@ void select_internal_with_gvl(struct select_arguments *arguments) {
|
|
549
553
|
select_internal((void *)arguments);
|
550
554
|
|
551
555
|
if (arguments->count == -1) {
|
552
|
-
|
556
|
+
if (errno != EINTR) {
|
557
|
+
rb_sys_fail("select_internal_with_gvl:epoll_wait");
|
558
|
+
} else {
|
559
|
+
arguments->count = 0;
|
560
|
+
}
|
553
561
|
}
|
554
562
|
}
|
555
563
|
|
@@ -605,7 +605,11 @@ void select_internal_without_gvl(struct select_arguments *arguments) {
|
|
605
605
|
arguments->data->blocked = 0;
|
606
606
|
|
607
607
|
if (arguments->count == -1) {
|
608
|
-
|
608
|
+
if (errno != EINTR) {
|
609
|
+
rb_sys_fail("select_internal_without_gvl:kevent");
|
610
|
+
} else {
|
611
|
+
arguments->count = 0;
|
612
|
+
}
|
609
613
|
}
|
610
614
|
}
|
611
615
|
|
@@ -614,7 +618,11 @@ void select_internal_with_gvl(struct select_arguments *arguments) {
|
|
614
618
|
select_internal((void *)arguments);
|
615
619
|
|
616
620
|
if (arguments->count == -1) {
|
617
|
-
|
621
|
+
if (errno != EINTR) {
|
622
|
+
rb_sys_fail("select_internal_with_gvl:kevent");
|
623
|
+
} else {
|
624
|
+
arguments->count = 0;
|
625
|
+
}
|
618
626
|
}
|
619
627
|
}
|
620
628
|
|
@@ -27,6 +27,8 @@
|
|
27
27
|
|
28
28
|
#include "pidfd.c"
|
29
29
|
|
30
|
+
#include <linux/version.h>
|
31
|
+
|
30
32
|
enum {
|
31
33
|
DEBUG = 0,
|
32
34
|
DEBUG_IO_READ = 0,
|
@@ -371,12 +373,28 @@ VALUE IO_Event_Selector_URing_io_wait(VALUE self, VALUE fiber, VALUE io, VALUE e
|
|
371
373
|
|
372
374
|
#ifdef HAVE_RUBY_IO_BUFFER_H
|
373
375
|
|
376
|
+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,16,0)
|
377
|
+
static inline off_t io_seekable(int descriptor) {
|
378
|
+
return -1;
|
379
|
+
}
|
380
|
+
#else
|
381
|
+
#warning Upgrade your kernel to 5.16! io_uring bugs prevent efficient io_read/io_write hooks.
|
382
|
+
static inline off_t io_seekable(int descriptor)
|
383
|
+
{
|
384
|
+
if (lseek(descriptor, 0, SEEK_CUR) == -1) {
|
385
|
+
return 0;
|
386
|
+
} else {
|
387
|
+
return -1;
|
388
|
+
}
|
389
|
+
}
|
390
|
+
#endif
|
391
|
+
|
374
392
|
static int io_read(struct IO_Event_Selector_URing *data, VALUE fiber, int descriptor, char *buffer, size_t length) {
|
375
393
|
struct io_uring_sqe *sqe = io_get_sqe(data);
|
376
394
|
|
377
395
|
if (DEBUG) fprintf(stderr, "io_read:io_uring_prep_read(fiber=%p)\n", (void*)fiber);
|
378
396
|
|
379
|
-
io_uring_prep_read(sqe, descriptor, buffer, length,
|
397
|
+
io_uring_prep_read(sqe, descriptor, buffer, length, io_seekable(descriptor));
|
380
398
|
io_uring_sqe_set_data(sqe, (void*)fiber);
|
381
399
|
io_uring_submit_now(data);
|
382
400
|
|
@@ -427,7 +445,7 @@ int io_write(struct IO_Event_Selector_URing *data, VALUE fiber, int descriptor,
|
|
427
445
|
|
428
446
|
if (DEBUG) fprintf(stderr, "io_write:io_uring_prep_write(fiber=%p)\n", (void*)fiber);
|
429
447
|
|
430
|
-
io_uring_prep_write(sqe, descriptor, buffer, length,
|
448
|
+
io_uring_prep_write(sqe, descriptor, buffer, length, io_seekable(descriptor));
|
431
449
|
io_uring_sqe_set_data(sqe, (void*)fiber);
|
432
450
|
io_uring_submit_pending(data);
|
433
451
|
|
@@ -558,6 +576,8 @@ int select_internal_without_gvl(struct select_arguments *arguments) {
|
|
558
576
|
|
559
577
|
if (arguments->result == -ETIME) {
|
560
578
|
arguments->result = 0;
|
579
|
+
} else if (arguments->result == -EINTR) {
|
580
|
+
arguments->result = 0;
|
561
581
|
} else if (arguments->result < 0) {
|
562
582
|
rb_syserr_fail(-arguments->result, "select_internal_without_gvl:io_uring_wait_cqe_timeout");
|
563
583
|
} else {
|
@@ -568,8 +588,6 @@ int select_internal_without_gvl(struct select_arguments *arguments) {
|
|
568
588
|
return arguments->result;
|
569
589
|
}
|
570
590
|
|
571
|
-
// #define IO_EVENT_SELECTOR_URING_UDATA_INTERRUPT ((__u64) -2)
|
572
|
-
|
573
591
|
static inline
|
574
592
|
unsigned select_process_completions(struct io_uring *ring) {
|
575
593
|
unsigned completed = 0;
|
@@ -585,10 +603,6 @@ unsigned select_process_completions(struct io_uring *ring) {
|
|
585
603
|
continue;
|
586
604
|
}
|
587
605
|
|
588
|
-
// if (cqe->user_data == IO_EVENT_SELECTOR_URING_UDATA_INTERRUPT) {
|
589
|
-
// io_uring_cq_advance(ring, 1);
|
590
|
-
// }
|
591
|
-
|
592
606
|
VALUE fiber = (VALUE)cqe->user_data;
|
593
607
|
VALUE result = RB_INT2NUM(cqe->res);
|
594
608
|
|
data/ext/kqueue.o
CHANGED
Binary file
|
data/lib/io/event/selector.rb
CHANGED
@@ -31,12 +31,10 @@ module IO::Event
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
if self.const_defined?(:
|
35
|
-
return
|
34
|
+
if self.const_defined?(:EPoll)
|
35
|
+
return EPoll
|
36
36
|
elsif self.const_defined?(:KQueue)
|
37
37
|
return KQueue
|
38
|
-
elsif self.const_defined?(:EPoll)
|
39
|
-
return EPoll
|
40
38
|
else
|
41
39
|
return Select
|
42
40
|
end
|
data/lib/io/event/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: io-event
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-12-
|
11
|
+
date: 2021-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bake
|
@@ -113,14 +113,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
113
113
|
requirements:
|
114
114
|
- - ">="
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version: '0'
|
116
|
+
version: '3.0'
|
117
117
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
118
|
requirements:
|
119
119
|
- - ">="
|
120
120
|
- !ruby/object:Gem::Version
|
121
121
|
version: '0'
|
122
122
|
requirements: []
|
123
|
-
rubygems_version: 3.
|
123
|
+
rubygems_version: 3.2.32
|
124
124
|
signing_key:
|
125
125
|
specification_version: 4
|
126
126
|
summary: An event loop.
|