io-event 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.
|