io-event 0.2.3 → 0.3.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/Makefile +25 -24
- data/ext/event.o +0 -0
- data/ext/extconf.h +4 -0
- data/ext/interrupt.o +0 -0
- data/ext/io/event/selector/epoll.c +22 -17
- data/ext/io/event/selector/kqueue.c +48 -17
- data/ext/io/event/selector/selector.h +5 -0
- data/ext/io/event/selector/uring.c +20 -17
- data/ext/kqueue.o +0 -0
- data/ext/mkmf.log +27 -45
- data/ext/selector.o +0 -0
- data/lib/io/event/selector/select.rb +38 -13
- data/lib/io/event/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ea156f474e12257bd5b2db77f8f647d8291a0e4fd6c3d78914e1f26abd35c52
|
4
|
+
data.tar.gz: fe0ebd9fce449827c06faf4d59d2c1ca86e62e9ccdbada21389646cd2133d7f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca948d973ad94bfbb9b6c166741e5cb5cd75439bfb47d07809a8d41fdecebdf4e9df9f0862aaa716ad444ab5ab9bf4b1cc1204698a5e7bd1a7f0ae6465c0dba2
|
7
|
+
data.tar.gz: 1e27d5073302b93a1ef9d5b51c6f8a5945546cc95e2b54b0985a746fc2810318c5c4c0f1b5cbc20686f277362cf197d2162a4f95d2b4bec2ee00e11f84ed2b1a
|
data/ext/IO_Event.bundle
CHANGED
Binary file
|
data/ext/Makefile
CHANGED
@@ -3,6 +3,7 @@ SHELL = /bin/sh
|
|
3
3
|
|
4
4
|
# V=0 quiet, V=1 verbose. other values don't work.
|
5
5
|
V = 0
|
6
|
+
V0 = $(V:0=)
|
6
7
|
Q1 = $(V:1=)
|
7
8
|
Q = $(Q1:0=@)
|
8
9
|
ECHO1 = $(V:1=@ :)
|
@@ -12,12 +13,12 @@ NULLCMD = :
|
|
12
13
|
#### Start of system configuration section. ####
|
13
14
|
|
14
15
|
srcdir = .
|
15
|
-
topdir = /Users/samuel/.rubies/ruby-
|
16
|
+
topdir = /Users/samuel/.rubies/ruby-head/include/ruby-3.1.0
|
16
17
|
hdrdir = $(topdir)
|
17
|
-
arch_hdrdir = /Users/samuel/.rubies/ruby-
|
18
|
+
arch_hdrdir = /Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21
|
18
19
|
PATH_SEPARATOR = :
|
19
20
|
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby:$(srcdir)/io/event:$(srcdir)/io/event/selector
|
20
|
-
prefix = $(DESTDIR)/Users/samuel/.rubies/ruby-
|
21
|
+
prefix = $(DESTDIR)/Users/samuel/.rubies/ruby-head
|
21
22
|
rubysitearchprefix = $(rubylibprefix)/$(sitearch)
|
22
23
|
rubyarchprefix = $(rubylibprefix)/$(arch)
|
23
24
|
rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
|
@@ -50,8 +51,8 @@ dvidir = $(docdir)
|
|
50
51
|
htmldir = $(docdir)
|
51
52
|
infodir = $(datarootdir)/info
|
52
53
|
docdir = $(datarootdir)/doc/$(PACKAGE)
|
53
|
-
oldincludedir = $(
|
54
|
-
includedir = $(prefix)/include
|
54
|
+
oldincludedir = $(DESTDIR)/usr/include
|
55
|
+
includedir = $(SDKROOT)$(prefix)/include
|
55
56
|
runstatedir = $(localstatedir)/run
|
56
57
|
localstatedir = $(prefix)/var
|
57
58
|
sharedstatedir = $(prefix)/com
|
@@ -65,33 +66,33 @@ archdir = $(rubyarchdir)
|
|
65
66
|
|
66
67
|
|
67
68
|
CC_WRAPPER =
|
68
|
-
CC = clang
|
69
|
-
CXX = clang++
|
69
|
+
CC = clang
|
70
|
+
CXX = clang++
|
70
71
|
LIBRUBY = $(LIBRUBY_A)
|
71
72
|
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
|
72
73
|
LIBRUBYARG_SHARED =
|
73
|
-
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework
|
74
|
+
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework CoreFoundation $(MAINLIBS)
|
74
75
|
empty =
|
75
76
|
OUTFLAG = -o $(empty)
|
76
77
|
COUTFLAG = -o $(empty)
|
77
78
|
CSRCFLAG = $(empty)
|
78
79
|
|
79
80
|
RUBY_EXTCONF_H = extconf.h
|
80
|
-
cflags = $(optflags) $(debugflags) $(warnflags)
|
81
|
+
cflags = -fdeclspec $(optflags) $(debugflags) $(warnflags)
|
81
82
|
cxxflags =
|
82
|
-
optflags = -O3
|
83
|
+
optflags = -O3 -fno-fast-math
|
83
84
|
debugflags = -ggdb3
|
84
|
-
warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens
|
85
|
+
warnflags = -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef
|
85
86
|
cppflags =
|
86
87
|
CCDLFLAGS = -fno-common
|
87
|
-
CFLAGS = $(CCDLFLAGS) $(cflags)
|
88
|
+
CFLAGS = $(CCDLFLAGS) $(cflags) -pipe -Wall $(ARCH_FLAG)
|
88
89
|
INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
|
89
90
|
DEFS =
|
90
|
-
CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\"
|
91
|
-
CXXFLAGS = $(CCDLFLAGS)
|
92
|
-
ldflags = -L. -fstack-protector-strong
|
93
|
-
dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress
|
94
|
-
ARCH_FLAG =
|
91
|
+
CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\" -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags)
|
92
|
+
CXXFLAGS = $(CCDLFLAGS) -fdeclspec $(ARCH_FLAG)
|
93
|
+
ldflags = -L. -fstack-protector-strong
|
94
|
+
dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress
|
95
|
+
ARCH_FLAG =
|
95
96
|
DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
|
96
97
|
LDSHARED = $(CC) -dynamic -bundle
|
97
98
|
LDSHAREDXX = $(CXX) -dynamic -bundle
|
@@ -99,7 +100,7 @@ AR = ar
|
|
99
100
|
EXEEXT =
|
100
101
|
|
101
102
|
RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)
|
102
|
-
RUBY_SO_NAME = ruby.3.
|
103
|
+
RUBY_SO_NAME = ruby.3.1
|
103
104
|
RUBYW_INSTALL_NAME =
|
104
105
|
RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version)
|
105
106
|
RUBYW_BASE_NAME = rubyw
|
@@ -107,13 +108,13 @@ RUBY_BASE_NAME = ruby
|
|
107
108
|
|
108
109
|
arch = arm64-darwin21
|
109
110
|
sitearch = $(arch)
|
110
|
-
ruby_version = 3.
|
111
|
+
ruby_version = 3.1.0
|
111
112
|
ruby = $(bindir)/$(RUBY_BASE_NAME)
|
112
113
|
RUBY = $(ruby)
|
113
114
|
ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h $(RUBY_EXTCONF_H)
|
114
115
|
|
115
116
|
RM = rm -f
|
116
|
-
RM_RF =
|
117
|
+
RM_RF = rm -fr
|
117
118
|
RMDIRS = rmdir -p
|
118
119
|
MAKEDIRS = /opt/local/bin/gmkdir -p
|
119
120
|
INSTALL = /opt/local/bin/ginstall -c
|
@@ -125,8 +126,8 @@ TOUCH = exit >
|
|
125
126
|
#### End of system configuration section. ####
|
126
127
|
|
127
128
|
preload =
|
128
|
-
libpath = . $(libdir)
|
129
|
-
LIBPATH = -L. -L$(libdir)
|
129
|
+
libpath = . $(libdir)
|
130
|
+
LIBPATH = -L. -L$(libdir)
|
130
131
|
DEFFILE =
|
131
132
|
|
132
133
|
CLEANFILES = mkmf.log
|
@@ -159,7 +160,7 @@ HDRDIR = $(sitehdrdir)$(target_prefix)
|
|
159
160
|
ARCHHDRDIR = $(sitearchhdrdir)$(target_prefix)
|
160
161
|
TARGET_SO_DIR =
|
161
162
|
TARGET_SO = $(TARGET_SO_DIR)$(DLLIB)
|
162
|
-
CLEANLIBS = $(TARGET_SO)
|
163
|
+
CLEANLIBS = $(TARGET_SO) $(TARGET_SO).dSYM
|
163
164
|
CLEANOBJS = *.o *.bak
|
164
165
|
|
165
166
|
all: $(DLLIB)
|
@@ -172,7 +173,7 @@ clean-rb-default::
|
|
172
173
|
clean-rb::
|
173
174
|
clean-so::
|
174
175
|
clean: clean-so clean-static clean-rb-default clean-rb
|
175
|
-
-$(Q)$(
|
176
|
+
-$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time
|
176
177
|
|
177
178
|
distclean-rb-default::
|
178
179
|
distclean-rb::
|
data/ext/event.o
CHANGED
Binary file
|
data/ext/extconf.h
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
#ifndef EXTCONF_H
|
2
2
|
#define EXTCONF_H
|
3
3
|
#define HAVE_RB_EXT_RACTOR_SAFE 1
|
4
|
+
#define HAVE__RB_FIBER_TRANSFER 1
|
4
5
|
#define HAVE_SYS_EVENT_H 1
|
6
|
+
#define HAVE_RB_IO_DESCRIPTOR 1
|
5
7
|
#define HAVE_RB_FIBER_CURRENT 1
|
8
|
+
#define HAVE__RB_FIBER_RAISE 1
|
9
|
+
#define HAVE_RUBY_IO_BUFFER_H 1
|
6
10
|
#endif
|
data/ext/interrupt.o
CHANGED
Binary file
|
@@ -115,7 +115,7 @@ VALUE IO_Event_Selector_EPoll_initialize(VALUE self, VALUE loop) {
|
|
115
115
|
int result = epoll_create1(EPOLL_CLOEXEC);
|
116
116
|
|
117
117
|
if (result == -1) {
|
118
|
-
rb_sys_fail("epoll_create");
|
118
|
+
rb_sys_fail("IO_Event_Selector_EPoll_initialize:epoll_create");
|
119
119
|
} else {
|
120
120
|
data->descriptor = result;
|
121
121
|
|
@@ -241,7 +241,7 @@ VALUE IO_Event_Selector_EPoll_process_wait(VALUE self, VALUE fiber, VALUE pid, V
|
|
241
241
|
int result = epoll_ctl(data->descriptor, EPOLL_CTL_ADD, process_wait_arguments.descriptor, &event);
|
242
242
|
|
243
243
|
if (result == -1) {
|
244
|
-
rb_sys_fail("epoll_ctl
|
244
|
+
rb_sys_fail("IO_Event_Selector_EPoll_process_wait:epoll_ctl");
|
245
245
|
}
|
246
246
|
|
247
247
|
return rb_ensure(process_wait_transfer, (VALUE)&process_wait_arguments, process_wait_ensure, (VALUE)&process_wait_arguments);
|
@@ -326,13 +326,13 @@ VALUE IO_Event_Selector_EPoll_io_wait(VALUE self, VALUE fiber, VALUE io, VALUE e
|
|
326
326
|
rb_update_max_fd(duplicate);
|
327
327
|
|
328
328
|
if (descriptor == -1)
|
329
|
-
rb_sys_fail("dup");
|
329
|
+
rb_sys_fail("IO_Event_Selector_EPoll_io_wait:dup");
|
330
330
|
|
331
331
|
result = epoll_ctl(data->descriptor, EPOLL_CTL_ADD, descriptor, &event);
|
332
332
|
}
|
333
333
|
|
334
334
|
if (result == -1) {
|
335
|
-
rb_sys_fail("epoll_ctl");
|
335
|
+
rb_sys_fail("IO_Event_Selector_EPoll_io_wait:epoll_ctl");
|
336
336
|
}
|
337
337
|
|
338
338
|
struct io_wait_arguments io_wait_arguments = {
|
@@ -370,23 +370,24 @@ VALUE io_read_loop(VALUE _arguments) {
|
|
370
370
|
size_t offset = 0;
|
371
371
|
size_t length = arguments->length;
|
372
372
|
|
373
|
-
while (
|
373
|
+
while (true) {
|
374
374
|
size_t maximum_size = size - offset;
|
375
375
|
ssize_t result = read(arguments->descriptor, (char*)base+offset, maximum_size);
|
376
376
|
|
377
|
-
if (result
|
378
|
-
break;
|
379
|
-
} else if (result > 0) {
|
377
|
+
if (result > 0) {
|
380
378
|
offset += result;
|
379
|
+
if ((size_t)result >= length) break;
|
381
380
|
length -= result;
|
382
|
-
} else if (
|
381
|
+
} else if (result == 0) {
|
382
|
+
break;
|
383
|
+
} else if (length > 0 && IO_Event_try_again(-result)) {
|
383
384
|
IO_Event_Selector_EPoll_io_wait(arguments->self, arguments->fiber, arguments->io, RB_INT2NUM(IO_EVENT_READABLE));
|
384
385
|
} else {
|
385
|
-
|
386
|
+
return rb_fiber_scheduler_io_result(-1, -result);
|
386
387
|
}
|
387
388
|
}
|
388
389
|
|
389
|
-
return
|
390
|
+
return rb_fiber_scheduler_io_result(offset, 0);
|
390
391
|
}
|
391
392
|
|
392
393
|
static
|
@@ -445,20 +446,24 @@ VALUE io_write_loop(VALUE _arguments) {
|
|
445
446
|
rb_raise(rb_eRuntimeError, "Length exceeds size of buffer!");
|
446
447
|
}
|
447
448
|
|
448
|
-
while (
|
449
|
-
|
449
|
+
while (true) {
|
450
|
+
size_t maximum_size = size - offset;
|
451
|
+
ssize_t result = write(arguments->descriptor, (char*)base+offset, maximum_size);
|
450
452
|
|
451
|
-
if (result
|
453
|
+
if (result > 0) {
|
452
454
|
offset += result;
|
455
|
+
if ((size_t)result >= length) break;
|
453
456
|
length -= result;
|
454
|
-
} else if (
|
457
|
+
} else if (result == 0) {
|
458
|
+
break;
|
459
|
+
} else if (length > 0 && IO_Event_try_again(errno)) {
|
455
460
|
IO_Event_Selector_EPoll_io_wait(arguments->self, arguments->fiber, arguments->io, RB_INT2NUM(IO_EVENT_WRITABLE));
|
456
461
|
} else {
|
457
|
-
|
462
|
+
return rb_fiber_scheduler_io_result(-1, errno);
|
458
463
|
}
|
459
464
|
}
|
460
465
|
|
461
|
-
return
|
466
|
+
return rb_fiber_scheduler_io_result(offset, 0);
|
462
467
|
};
|
463
468
|
|
464
469
|
static
|
@@ -26,6 +26,13 @@
|
|
26
26
|
#include <time.h>
|
27
27
|
#include <errno.h>
|
28
28
|
|
29
|
+
enum {
|
30
|
+
DEBUG = 0,
|
31
|
+
DEBUG_IO_READ = 0,
|
32
|
+
DEBUG_IO_WRITE = 0,
|
33
|
+
DEBUG_IO_WAIT = 0
|
34
|
+
};
|
35
|
+
|
29
36
|
static VALUE IO_Event_Selector_KQueue = Qnil;
|
30
37
|
|
31
38
|
enum {KQUEUE_MAX_EVENTS = 64};
|
@@ -95,7 +102,7 @@ VALUE IO_Event_Selector_KQueue_initialize(VALUE self, VALUE loop) {
|
|
95
102
|
int result = kqueue();
|
96
103
|
|
97
104
|
if (result == -1) {
|
98
|
-
rb_sys_fail("kqueue");
|
105
|
+
rb_sys_fail("IO_Event_Selector_KQueue_initialize:kqueue");
|
99
106
|
} else {
|
100
107
|
ioctl(result, FIOCLEX);
|
101
108
|
data->descriptor = result;
|
@@ -195,7 +202,7 @@ int process_add_filters(int descriptor, int ident, VALUE fiber) {
|
|
195
202
|
return 0;
|
196
203
|
}
|
197
204
|
|
198
|
-
rb_sys_fail("kevent
|
205
|
+
rb_sys_fail("process_add_filters:kevent");
|
199
206
|
}
|
200
207
|
|
201
208
|
return 1;
|
@@ -289,7 +296,7 @@ int io_add_filters(int descriptor, int ident, int events, VALUE fiber) {
|
|
289
296
|
int result = kevent(descriptor, kevents, count, NULL, 0, NULL);
|
290
297
|
|
291
298
|
if (result == -1) {
|
292
|
-
rb_sys_fail("kevent
|
299
|
+
rb_sys_fail("io_add_filters:kevent");
|
293
300
|
}
|
294
301
|
|
295
302
|
return events;
|
@@ -363,6 +370,8 @@ VALUE IO_Event_Selector_KQueue_io_wait(VALUE self, VALUE fiber, VALUE io, VALUE
|
|
363
370
|
.descriptor = descriptor,
|
364
371
|
};
|
365
372
|
|
373
|
+
if (DEBUG_IO_WAIT) fprintf(stderr, "IO_Event_Selector_KQueue_io_wait descriptor=%d\n", descriptor);
|
374
|
+
|
366
375
|
return rb_rescue(io_wait_transfer, (VALUE)&io_wait_arguments, io_wait_rescue, (VALUE)&io_wait_arguments);
|
367
376
|
}
|
368
377
|
|
@@ -392,23 +401,31 @@ VALUE io_read_loop(VALUE _arguments) {
|
|
392
401
|
size_t offset = 0;
|
393
402
|
size_t length = arguments->length;
|
394
403
|
|
395
|
-
|
404
|
+
if (DEBUG_IO_READ) fprintf(stderr, "io_read_loop(fd=%d, length=%zu)\n", arguments->descriptor, length);
|
405
|
+
|
406
|
+
while (true) {
|
396
407
|
size_t maximum_size = size - offset;
|
408
|
+
if (DEBUG_IO_READ) fprintf(stderr, "read(%d, +%ld, %ld)\n", arguments->descriptor, offset, maximum_size);
|
397
409
|
ssize_t result = read(arguments->descriptor, (char*)base+offset, maximum_size);
|
410
|
+
if (DEBUG_IO_READ) fprintf(stderr, "read(%d, +%ld, %ld) -> %lld\n", arguments->descriptor, offset, maximum_size, result);
|
398
411
|
|
399
|
-
if (result
|
400
|
-
break;
|
401
|
-
} else if (result > 0) {
|
412
|
+
if (result > 0) {
|
402
413
|
offset += result;
|
414
|
+
if ((size_t)result >= length) break;
|
403
415
|
length -= result;
|
404
|
-
} else if (
|
416
|
+
} else if (result == 0) {
|
417
|
+
break;
|
418
|
+
} else if (length > 0 && IO_Event_try_again(errno)) {
|
419
|
+
if (DEBUG_IO_READ) fprintf(stderr, "IO_Event_Selector_KQueue_io_wait(fd=%d, length=%zu)\n", arguments->descriptor, length);
|
405
420
|
IO_Event_Selector_KQueue_io_wait(arguments->self, arguments->fiber, arguments->io, RB_INT2NUM(IO_EVENT_READABLE));
|
406
421
|
} else {
|
407
|
-
|
422
|
+
if (DEBUG_IO_READ) fprintf(stderr, "io_read_loop(fd=%d, length=%zu) -> errno=%d\n", arguments->descriptor, length, errno);
|
423
|
+
return rb_fiber_scheduler_io_result(-1, errno);
|
408
424
|
}
|
409
425
|
}
|
410
426
|
|
411
|
-
|
427
|
+
if (DEBUG_IO_READ) fprintf(stderr, "io_read_loop(fd=%d, length=%zu) -> %zu\n", arguments->descriptor, length, offset);
|
428
|
+
return rb_fiber_scheduler_io_result(offset, 0);
|
412
429
|
}
|
413
430
|
|
414
431
|
static
|
@@ -470,20 +487,31 @@ VALUE io_write_loop(VALUE _arguments) {
|
|
470
487
|
rb_raise(rb_eRuntimeError, "Length exceeds size of buffer!");
|
471
488
|
}
|
472
489
|
|
473
|
-
|
474
|
-
|
490
|
+
if (DEBUG_IO_WRITE) fprintf(stderr, "io_write_loop(fd=%d, length=%zu)\n", arguments->descriptor, length);
|
491
|
+
|
492
|
+
while (true) {
|
493
|
+
size_t maximum_size = size - offset;
|
494
|
+
if (DEBUG_IO_WRITE) fprintf(stderr, "write(%d, +%ld, %ld, length=%zu)\n", arguments->descriptor, offset, maximum_size, length);
|
495
|
+
ssize_t result = write(arguments->descriptor, (char*)base+offset, maximum_size);
|
496
|
+
if (DEBUG_IO_WRITE) fprintf(stderr, "write(%d, +%ld, %ld) -> %lld\n", arguments->descriptor, offset, maximum_size, result);
|
475
497
|
|
476
|
-
if (result
|
498
|
+
if (result > 0) {
|
477
499
|
offset += result;
|
500
|
+
if ((size_t)result >= length) break;
|
478
501
|
length -= result;
|
479
|
-
} else if (
|
480
|
-
|
502
|
+
} else if (result == 0) {
|
503
|
+
break;
|
504
|
+
} else if (length > 0 && IO_Event_try_again(errno)) {
|
505
|
+
if (DEBUG_IO_WRITE) fprintf(stderr, "IO_Event_Selector_KQueue_io_wait(fd=%d, length=%zu)\n", arguments->descriptor, length);
|
506
|
+
IO_Event_Selector_KQueue_io_wait(arguments->self, arguments->fiber, arguments->io, RB_INT2NUM(IO_EVENT_READABLE));
|
481
507
|
} else {
|
482
|
-
|
508
|
+
if (DEBUG_IO_WRITE) fprintf(stderr, "io_write_loop(fd=%d, length=%zu) -> errno=%d\n", arguments->descriptor, length, errno);
|
509
|
+
return rb_fiber_scheduler_io_result(-1, errno);
|
483
510
|
}
|
484
511
|
}
|
485
512
|
|
486
|
-
|
513
|
+
if (DEBUG_IO_READ) fprintf(stderr, "io_write_loop(fd=%d, length=%zu) -> %zu\n", arguments->descriptor, length, offset);
|
514
|
+
return rb_fiber_scheduler_io_result(offset, 0);
|
487
515
|
};
|
488
516
|
|
489
517
|
static
|
@@ -614,7 +642,9 @@ VALUE IO_Event_Selector_KQueue_select(VALUE self, VALUE duration) {
|
|
614
642
|
// Non-comprehensive testing shows this gives a 1.5x speedup.
|
615
643
|
|
616
644
|
// First do the syscall with no timeout to get any immediately available events:
|
645
|
+
if (DEBUG) fprintf(stderr, "\r\nselect_internal_with_gvl timeout=" PRINTF_TIMESPEC "\r\n", PRINTF_TIMESPEC_ARGS(arguments.storage));
|
617
646
|
select_internal_with_gvl(&arguments);
|
647
|
+
if (DEBUG) fprintf(stderr, "\r\nselect_internal_with_gvl done\r\n");
|
618
648
|
|
619
649
|
// If we:
|
620
650
|
// 1. Didn't process any ready fibers, and
|
@@ -627,6 +657,7 @@ VALUE IO_Event_Selector_KQueue_select(VALUE self, VALUE duration) {
|
|
627
657
|
if (!timeout_nonblocking(arguments.timeout)) {
|
628
658
|
arguments.count = KQUEUE_MAX_EVENTS;
|
629
659
|
|
660
|
+
if (DEBUG) fprintf(stderr, "IO_Event_Selector_KQueue_select timeout=" PRINTF_TIMESPEC "\n", PRINTF_TIMESPEC_ARGS(arguments.storage));
|
630
661
|
select_internal_without_gvl(&arguments);
|
631
662
|
}
|
632
663
|
}
|
@@ -26,6 +26,7 @@
|
|
26
26
|
|
27
27
|
#ifdef HAVE_RUBY_IO_BUFFER_H
|
28
28
|
#include <ruby/io/buffer.h>
|
29
|
+
#include <ruby/fiber/scheduler.h>
|
29
30
|
#endif
|
30
31
|
|
31
32
|
#include <time.h>
|
@@ -40,6 +41,10 @@ enum IO_Event {
|
|
40
41
|
|
41
42
|
void Init_IO_Event_Selector();
|
42
43
|
|
44
|
+
static inline int IO_Event_try_again(int error) {
|
45
|
+
return error == EAGAIN || error == EWOULDBLOCK;
|
46
|
+
}
|
47
|
+
|
43
48
|
VALUE IO_Event_Selector_fiber_transfer(VALUE fiber, int argc, VALUE *argv);
|
44
49
|
|
45
50
|
#ifdef HAVE__RB_FIBER_RAISE
|
@@ -100,7 +100,7 @@ VALUE IO_Event_Selector_URing_initialize(VALUE self, VALUE loop) {
|
|
100
100
|
int result = io_uring_queue_init(URING_ENTRIES, &data->ring, 0);
|
101
101
|
|
102
102
|
if (result < 0) {
|
103
|
-
rb_syserr_fail(-result, "io_uring_queue_init");
|
103
|
+
rb_syserr_fail(-result, "IO_Event_Selector_URing_initialize:io_uring_queue_init");
|
104
104
|
}
|
105
105
|
|
106
106
|
rb_update_max_fd(data->ring.ring_fd);
|
@@ -186,7 +186,7 @@ int io_uring_submit_flush(struct IO_Event_Selector_URing *data) {
|
|
186
186
|
// If it was submitted, reset pending count:
|
187
187
|
data->pending = 0;
|
188
188
|
} else if (result != -EBUSY && result != -EAGAIN) {
|
189
|
-
rb_syserr_fail(-result, "io_uring_submit_flush");
|
189
|
+
rb_syserr_fail(-result, "io_uring_submit_flush:io_uring_submit");
|
190
190
|
}
|
191
191
|
|
192
192
|
return result;
|
@@ -208,7 +208,7 @@ int io_uring_submit_now(struct IO_Event_Selector_URing *data) {
|
|
208
208
|
if (result == -EBUSY || result == -EAGAIN) {
|
209
209
|
IO_Event_Selector_yield(&data->backend);
|
210
210
|
} else {
|
211
|
-
rb_syserr_fail(-result, "io_uring_submit_now");
|
211
|
+
rb_syserr_fail(-result, "io_uring_submit_now:io_uring_submit");
|
212
212
|
}
|
213
213
|
}
|
214
214
|
}
|
@@ -396,24 +396,24 @@ VALUE IO_Event_Selector_URing_io_read(VALUE self, VALUE fiber, VALUE io, VALUE b
|
|
396
396
|
size_t offset = 0;
|
397
397
|
size_t length = NUM2SIZET(_length);
|
398
398
|
|
399
|
-
while (
|
399
|
+
while (true) {
|
400
400
|
size_t maximum_size = size - offset;
|
401
401
|
int result = io_read(data, fiber, descriptor, (char*)base+offset, maximum_size);
|
402
402
|
|
403
|
-
if (result
|
404
|
-
break;
|
405
|
-
} else if (result > 0) {
|
403
|
+
if (result > 0) {
|
406
404
|
offset += result;
|
407
405
|
if ((size_t)result >= length) break;
|
408
406
|
length -= result;
|
409
|
-
} else if (
|
407
|
+
} else if (result == 0) {
|
408
|
+
break;
|
409
|
+
} else if (length > 0 && IO_Event_try_again(-result)) {
|
410
410
|
IO_Event_Selector_URing_io_wait(self, fiber, io, RB_INT2NUM(IO_EVENT_READABLE));
|
411
411
|
} else {
|
412
|
-
|
412
|
+
return rb_fiber_scheduler_io_result(-1, -result);
|
413
413
|
}
|
414
414
|
}
|
415
415
|
|
416
|
-
return
|
416
|
+
return rb_fiber_scheduler_io_result(offset, 0);
|
417
417
|
}
|
418
418
|
|
419
419
|
static
|
@@ -449,21 +449,24 @@ VALUE IO_Event_Selector_URing_io_write(VALUE self, VALUE fiber, VALUE io, VALUE
|
|
449
449
|
rb_raise(rb_eRuntimeError, "Length exceeds size of buffer!");
|
450
450
|
}
|
451
451
|
|
452
|
-
while (
|
453
|
-
|
452
|
+
while (true) {
|
453
|
+
size_t maximum_size = size - offset;
|
454
|
+
int result = io_write(data, fiber, descriptor, (char*)base+offset, maximum_size);
|
454
455
|
|
455
|
-
if (result
|
456
|
+
if (result > 0) {
|
456
457
|
offset += result;
|
457
458
|
if ((size_t)result >= length) break;
|
458
459
|
length -= result;
|
459
|
-
} else if (
|
460
|
+
} else if (result == 0) {
|
461
|
+
break;
|
462
|
+
} else if (length > 0 && IO_Event_try_again(-result)) {
|
460
463
|
IO_Event_Selector_URing_io_wait(self, fiber, io, RB_INT2NUM(IO_EVENT_WRITABLE));
|
461
464
|
} else {
|
462
|
-
|
465
|
+
return rb_fiber_scheduler_io_result(-1, -result);
|
463
466
|
}
|
464
467
|
}
|
465
468
|
|
466
|
-
return
|
469
|
+
return rb_fiber_scheduler_io_result(offset, 0);
|
467
470
|
}
|
468
471
|
|
469
472
|
#endif
|
@@ -551,7 +554,7 @@ int select_internal_without_gvl(struct select_arguments *arguments) {
|
|
551
554
|
if (arguments->result == -ETIME) {
|
552
555
|
arguments->result = 0;
|
553
556
|
} else if (arguments->result < 0) {
|
554
|
-
rb_syserr_fail(-arguments->result, "select_internal_without_gvl:
|
557
|
+
rb_syserr_fail(-arguments->result, "select_internal_without_gvl:io_uring_wait_cqe_timeout");
|
555
558
|
} else {
|
556
559
|
// At least 1 event is waiting:
|
557
560
|
arguments->result = 1;
|
data/ext/kqueue.o
CHANGED
Binary file
|
data/ext/mkmf.log
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
have_func: checking for rb_ext_ractor_safe()... -------------------- yes
|
2
2
|
|
3
|
-
"clang -
|
3
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -o conftest -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall conftest.c -L. -L/Users/samuel/.rubies/ruby-head/lib -L. -fstack-protector-strong -lruby.3.1-static -framework CoreFoundation -lpthread -ldl -lobjc "
|
4
4
|
checked program was:
|
5
5
|
/* begin */
|
6
6
|
1: #include "ruby.h"
|
@@ -11,7 +11,7 @@ checked program was:
|
|
11
11
|
6: }
|
12
12
|
/* end */
|
13
13
|
|
14
|
-
"clang -
|
14
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -o conftest -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall conftest.c -L. -L/Users/samuel/.rubies/ruby-head/lib -L. -fstack-protector-strong -lruby.3.1-static -framework CoreFoundation -lpthread -ldl -lobjc "
|
15
15
|
checked program was:
|
16
16
|
/* begin */
|
17
17
|
1: #include "ruby.h"
|
@@ -32,13 +32,9 @@ checked program was:
|
|
32
32
|
|
33
33
|
--------------------
|
34
34
|
|
35
|
-
have_func: checking for &rb_fiber_transfer()... --------------------
|
35
|
+
have_func: checking for &rb_fiber_transfer()... -------------------- yes
|
36
36
|
|
37
|
-
"clang -
|
38
|
-
conftest.c:14:76: error: use of undeclared identifier 'rb_fiber_transfer'
|
39
|
-
int t(void) { const volatile void *volatile p; p = (const volatile void *)&rb_fiber_transfer; return !p; }
|
40
|
-
^
|
41
|
-
1 error generated.
|
37
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -o conftest -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall conftest.c -L. -L/Users/samuel/.rubies/ruby-head/lib -L. -fstack-protector-strong -lruby.3.1-static -framework CoreFoundation -lpthread -ldl -lobjc "
|
42
38
|
checked program was:
|
43
39
|
/* begin */
|
44
40
|
1: #include "ruby.h"
|
@@ -61,7 +57,7 @@ checked program was:
|
|
61
57
|
|
62
58
|
have_library: checking for -luring... -------------------- no
|
63
59
|
|
64
|
-
"clang -
|
60
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -o conftest -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall conftest.c -L. -L/Users/samuel/.rubies/ruby-head/lib -L. -fstack-protector-strong -lruby.3.1-static -framework CoreFoundation -lpthread -ldl -lobjc -luring "
|
65
61
|
ld: library not found for -luring
|
66
62
|
clang: error: linker command failed with exit code 1 (use -v to see invocation)
|
67
63
|
checked program was:
|
@@ -87,7 +83,7 @@ checked program was:
|
|
87
83
|
|
88
84
|
have_header: checking for sys/epoll.h... -------------------- no
|
89
85
|
|
90
|
-
"clang -
|
86
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall -c conftest.c"
|
91
87
|
conftest.c:3:10: fatal error: 'sys/epoll.h' file not found
|
92
88
|
#include <sys/epoll.h>
|
93
89
|
^~~~~~~~~~~~~
|
@@ -103,7 +99,7 @@ checked program was:
|
|
103
99
|
|
104
100
|
have_header: checking for sys/event.h... -------------------- yes
|
105
101
|
|
106
|
-
"clang -
|
102
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall -c conftest.c"
|
107
103
|
checked program was:
|
108
104
|
/* begin */
|
109
105
|
1: #include "ruby.h"
|
@@ -115,7 +111,7 @@ checked program was:
|
|
115
111
|
|
116
112
|
have_header: checking for sys/eventfd.h... -------------------- no
|
117
113
|
|
118
|
-
"clang -
|
114
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall -c conftest.c"
|
119
115
|
conftest.c:3:10: fatal error: 'sys/eventfd.h' file not found
|
120
116
|
#include <sys/eventfd.h>
|
121
117
|
^~~~~~~~~~~~~~~
|
@@ -129,9 +125,9 @@ checked program was:
|
|
129
125
|
|
130
126
|
--------------------
|
131
127
|
|
132
|
-
have_func: checking for rb_io_descriptor()... --------------------
|
128
|
+
have_func: checking for rb_io_descriptor()... -------------------- yes
|
133
129
|
|
134
|
-
"clang -
|
130
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -o conftest -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall conftest.c -L. -L/Users/samuel/.rubies/ruby-head/lib -L. -fstack-protector-strong -lruby.3.1-static -framework CoreFoundation -lpthread -ldl -lobjc "
|
135
131
|
conftest.c:14:57: error: use of undeclared identifier 'rb_io_descriptor'
|
136
132
|
int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_io_descriptor; return !p; }
|
137
133
|
^
|
@@ -154,12 +150,7 @@ checked program was:
|
|
154
150
|
14: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_io_descriptor; return !p; }
|
155
151
|
/* end */
|
156
152
|
|
157
|
-
"clang -
|
158
|
-
Undefined symbols for architecture arm64:
|
159
|
-
"_rb_io_descriptor", referenced from:
|
160
|
-
_t in conftest-1e4d1a.o
|
161
|
-
ld: symbol(s) not found for architecture arm64
|
162
|
-
clang: error: linker command failed with exit code 1 (use -v to see invocation)
|
153
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -o conftest -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall conftest.c -L. -L/Users/samuel/.rubies/ruby-head/lib -L. -fstack-protector-strong -lruby.3.1-static -framework CoreFoundation -lpthread -ldl -lobjc "
|
163
154
|
checked program was:
|
164
155
|
/* begin */
|
165
156
|
1: #include "ruby.h"
|
@@ -183,7 +174,7 @@ checked program was:
|
|
183
174
|
|
184
175
|
have_func: checking for &rb_process_status_wait()... -------------------- no
|
185
176
|
|
186
|
-
"clang -
|
177
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -o conftest -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall conftest.c -L. -L/Users/samuel/.rubies/ruby-head/lib -L. -fstack-protector-strong -lruby.3.1-static -framework CoreFoundation -lpthread -ldl -lobjc "
|
187
178
|
conftest.c:14:76: error: use of undeclared identifier 'rb_process_status_wait'
|
188
179
|
int t(void) { const volatile void *volatile p; p = (const volatile void *)&rb_process_status_wait; return !p; }
|
189
180
|
^
|
@@ -210,7 +201,7 @@ checked program was:
|
|
210
201
|
|
211
202
|
have_func: checking for rb_fiber_current()... -------------------- yes
|
212
203
|
|
213
|
-
"clang -
|
204
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -o conftest -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall conftest.c -L. -L/Users/samuel/.rubies/ruby-head/lib -L. -fstack-protector-strong -lruby.3.1-static -framework CoreFoundation -lpthread -ldl -lobjc "
|
214
205
|
checked program was:
|
215
206
|
/* begin */
|
216
207
|
1: #include "ruby.h"
|
@@ -231,17 +222,9 @@ checked program was:
|
|
231
222
|
|
232
223
|
--------------------
|
233
224
|
|
234
|
-
have_func: checking for &rb_fiber_raise()... --------------------
|
225
|
+
have_func: checking for &rb_fiber_raise()... -------------------- yes
|
235
226
|
|
236
|
-
"clang -
|
237
|
-
conftest.c:14:76: error: use of undeclared identifier 'rb_fiber_raise'; did you mean 'rb_fiber_resume'?
|
238
|
-
int t(void) { const volatile void *volatile p; p = (const volatile void *)&rb_fiber_raise; return !p; }
|
239
|
-
^~~~~~~~~~~~~~
|
240
|
-
rb_fiber_resume
|
241
|
-
/Users/samuel/.rubies/ruby-3.0.3/include/ruby-3.0.0/ruby/internal/intern/cont.h:32:7: note: 'rb_fiber_resume' declared here
|
242
|
-
VALUE rb_fiber_resume(VALUE fib, int argc, const VALUE *argv);
|
243
|
-
^
|
244
|
-
1 error generated.
|
227
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -o conftest -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall conftest.c -L. -L/Users/samuel/.rubies/ruby-head/lib -L. -fstack-protector-strong -lruby.3.1-static -framework CoreFoundation -lpthread -ldl -lobjc "
|
245
228
|
checked program was:
|
246
229
|
/* begin */
|
247
230
|
1: #include "ruby.h"
|
@@ -262,14 +245,9 @@ checked program was:
|
|
262
245
|
|
263
246
|
--------------------
|
264
247
|
|
265
|
-
have_header: checking for ruby/io/buffer.h... --------------------
|
248
|
+
have_header: checking for ruby/io/buffer.h... -------------------- yes
|
266
249
|
|
267
|
-
"clang -
|
268
|
-
conftest.c:3:10: fatal error: 'ruby/io/buffer.h' file not found
|
269
|
-
#include <ruby/io/buffer.h>
|
270
|
-
^~~~~~~~~~~~~~~~~~
|
271
|
-
conftest.c:3:10: note: did not find header 'io/buffer.h' in framework 'ruby' (loaded from '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks')
|
272
|
-
1 error generated.
|
250
|
+
DYLD_FALLBACK_LIBRARY_PATH=.:/Users/samuel/.rubies/ruby-head/lib "clang -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/arm64-darwin21 -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0/ruby/backward -I/Users/samuel/.rubies/ruby-head/include/ruby-3.1.0 -I. -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT -fdeclspec -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wdivision-by-zero -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wshorten-64-to-32 -Wwrite-strings -Wold-style-definition -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Wextra-tokens -Wundef -pipe -Wall -c conftest.c"
|
273
251
|
checked program was:
|
274
252
|
/* begin */
|
275
253
|
1: #include "ruby.h"
|
@@ -281,11 +259,15 @@ checked program was:
|
|
281
259
|
|
282
260
|
extconf.h is:
|
283
261
|
/* begin */
|
284
|
-
1: #ifndef EXTCONF_H
|
285
|
-
2: #define EXTCONF_H
|
286
|
-
3: #define HAVE_RB_EXT_RACTOR_SAFE 1
|
287
|
-
4: #define
|
288
|
-
5: #define
|
289
|
-
6: #
|
262
|
+
1: #ifndef EXTCONF_H
|
263
|
+
2: #define EXTCONF_H
|
264
|
+
3: #define HAVE_RB_EXT_RACTOR_SAFE 1
|
265
|
+
4: #define HAVE__RB_FIBER_TRANSFER 1
|
266
|
+
5: #define HAVE_SYS_EVENT_H 1
|
267
|
+
6: #define HAVE_RB_IO_DESCRIPTOR 1
|
268
|
+
7: #define HAVE_RB_FIBER_CURRENT 1
|
269
|
+
8: #define HAVE__RB_FIBER_RAISE 1
|
270
|
+
9: #define HAVE_RUBY_IO_BUFFER_H 1
|
271
|
+
10: #endif
|
290
272
|
/* end */
|
291
273
|
|
data/ext/selector.o
CHANGED
Binary file
|
@@ -134,25 +134,36 @@ module IO::Event
|
|
134
134
|
end
|
135
135
|
|
136
136
|
if IO.const_defined?(:Buffer)
|
137
|
+
EAGAIN = Errno::EAGAIN::Errno
|
138
|
+
|
137
139
|
def io_read(fiber, io, buffer, length)
|
138
140
|
offset = 0
|
139
141
|
|
140
|
-
while
|
141
|
-
# The maximum size we can read:
|
142
|
+
while true
|
142
143
|
maximum_size = buffer.size - offset
|
143
144
|
|
144
|
-
case result = io.read_nonblock(maximum_size, exception: false)
|
145
|
+
case result = blocking{io.read_nonblock(maximum_size, exception: false)}
|
145
146
|
when :wait_readable
|
146
|
-
|
147
|
+
if length > 0
|
148
|
+
self.io_wait(fiber, io, IO::READABLE)
|
149
|
+
else
|
150
|
+
return -EAGAIN
|
151
|
+
end
|
147
152
|
when :wait_writable
|
148
|
-
|
153
|
+
if length > 0
|
154
|
+
self.io_wait(fiber, io, IO::WRITABLE)
|
155
|
+
else
|
156
|
+
return -EAGAIN
|
157
|
+
end
|
149
158
|
else
|
150
159
|
break unless result
|
151
160
|
|
152
161
|
buffer.copy(result, offset)
|
153
162
|
|
154
|
-
|
155
|
-
|
163
|
+
size = result.bytesize
|
164
|
+
offset += size
|
165
|
+
break if size >= length
|
166
|
+
length -= size
|
156
167
|
end
|
157
168
|
end
|
158
169
|
|
@@ -162,16 +173,26 @@ module IO::Event
|
|
162
173
|
def io_write(fiber, io, buffer, length)
|
163
174
|
offset = 0
|
164
175
|
|
165
|
-
while
|
166
|
-
|
167
|
-
|
168
|
-
|
176
|
+
while true
|
177
|
+
maximum_size = buffer.size - offset
|
178
|
+
|
179
|
+
chunk = buffer.to_str(offset, maximum_size)
|
180
|
+
case result = blocking{io.write_nonblock(chunk, exception: false)}
|
169
181
|
when :wait_readable
|
170
|
-
|
182
|
+
if length > 0
|
183
|
+
self.io_wait(fiber, io, IO::READABLE)
|
184
|
+
else
|
185
|
+
return -EAGAIN
|
186
|
+
end
|
171
187
|
when :wait_writable
|
172
|
-
|
188
|
+
if length > 0
|
189
|
+
self.io_wait(fiber, io, IO::WRITABLE)
|
190
|
+
else
|
191
|
+
return -EAGAIN
|
192
|
+
end
|
173
193
|
else
|
174
194
|
offset += result
|
195
|
+
break if result >= length
|
175
196
|
length -= result
|
176
197
|
end
|
177
198
|
end
|
@@ -240,6 +261,10 @@ module IO::Event
|
|
240
261
|
|
241
262
|
return ready.size
|
242
263
|
end
|
264
|
+
|
265
|
+
private def blocking(&block)
|
266
|
+
Fiber.new(blocking: true, &block).resume
|
267
|
+
end
|
243
268
|
end
|
244
269
|
end
|
245
270
|
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.3.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-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bake
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
61
|
+
version: '0.6'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0.
|
68
|
+
version: '0.6'
|
69
69
|
description:
|
70
70
|
email:
|
71
71
|
executables: []
|
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
120
|
- !ruby/object:Gem::Version
|
121
121
|
version: '0'
|
122
122
|
requirements: []
|
123
|
-
rubygems_version: 3.
|
123
|
+
rubygems_version: 3.3.0.dev
|
124
124
|
signing_key:
|
125
125
|
specification_version: 4
|
126
126
|
summary: An event loop.
|