nio4r 2.5.2 → 2.7.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/.github/workflows/workflow.yml +61 -0
- data/.mailmap +16 -0
- data/.rubocop.yml +30 -11
- data/Gemfile +6 -6
- data/{CHANGES.md → changes.md} +78 -1
- data/examples/echo_server.rb +9 -2
- data/ext/libev/Changes +71 -2
- data/ext/libev/ev.c +611 -198
- 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/ext/nio4r/.clang-format +16 -0
- data/ext/nio4r/bytebuffer.c +101 -65
- data/ext/nio4r/extconf.rb +26 -0
- data/ext/nio4r/libev.h +1 -3
- data/ext/nio4r/monitor.c +81 -53
- data/ext/nio4r/nio4r.h +6 -15
- data/ext/nio4r/nio4r_ext.c +1 -1
- data/ext/nio4r/org/nio4r/ByteBuffer.java +2 -0
- data/ext/nio4r/org/nio4r/Monitor.java +1 -0
- data/ext/nio4r/org/nio4r/Selector.java +8 -10
- data/ext/nio4r/selector.c +132 -93
- data/lib/nio/bytebuffer.rb +10 -0
- data/lib/nio/monitor.rb +8 -1
- data/lib/nio/selector.rb +27 -10
- data/lib/nio/version.rb +6 -1
- data/lib/nio.rb +29 -1
- data/lib/nio4r.rb +5 -0
- data/license.md +77 -0
- data/nio4r.gemspec +6 -5
- data/rakelib/extension.rake +1 -2
- data/readme.md +91 -0
- data/spec/nio/acceptables_spec.rb +4 -0
- data/spec/nio/bytebuffer_spec.rb +6 -1
- data/spec/nio/monitor_spec.rb +7 -0
- data/spec/nio/selectables/pipe_spec.rb +6 -0
- data/spec/nio/selectables/ssl_socket_spec.rb +7 -0
- data/spec/nio/selectables/tcp_socket_spec.rb +7 -0
- data/spec/nio/selectables/udp_socket_spec.rb +9 -2
- data/spec/nio/selector_spec.rb +16 -1
- data/spec/spec_helper.rb +7 -2
- data/spec/support/selectable_examples.rb +8 -0
- metadata +20 -16
- data/.travis.yml +0 -44
- data/Guardfile +0 -10
- data/README.md +0 -150
- data/appveyor.yml +0 -40
data/ext/nio4r/bytebuffer.c
CHANGED
@@ -8,8 +8,8 @@ static VALUE cNIO_ByteBuffer_MarkUnsetError = Qnil;
|
|
8
8
|
|
9
9
|
/* Allocator/deallocator */
|
10
10
|
static VALUE NIO_ByteBuffer_allocate(VALUE klass);
|
11
|
-
static void
|
12
|
-
static
|
11
|
+
static void NIO_ByteBuffer_free(void *data);
|
12
|
+
static size_t NIO_ByteBuffer_memsize(const void *data);
|
13
13
|
|
14
14
|
/* Methods */
|
15
15
|
static VALUE NIO_ByteBuffer_initialize(VALUE self, VALUE capacity);
|
@@ -36,13 +36,33 @@ static VALUE NIO_ByteBuffer_inspect(VALUE self);
|
|
36
36
|
|
37
37
|
#define MARK_UNSET -1
|
38
38
|
|
39
|
+
/* Compatibility for Ruby <= 3.1 */
|
40
|
+
#ifndef HAVE_RB_IO_DESCRIPTOR
|
41
|
+
static int
|
42
|
+
io_descriptor_fallback(VALUE io)
|
43
|
+
{
|
44
|
+
rb_io_t *fptr;
|
45
|
+
GetOpenFile(io, fptr);
|
46
|
+
return fptr->fd;
|
47
|
+
}
|
48
|
+
#define rb_io_descriptor io_descriptor_fallback
|
49
|
+
#endif
|
50
|
+
|
51
|
+
static void
|
52
|
+
io_set_nonblock(VALUE io)
|
53
|
+
{
|
54
|
+
rb_io_t *fptr;
|
55
|
+
GetOpenFile(io, fptr);
|
56
|
+
rb_io_set_nonblock(fptr);
|
57
|
+
}
|
58
|
+
|
39
59
|
void Init_NIO_ByteBuffer()
|
40
60
|
{
|
41
61
|
mNIO = rb_define_module("NIO");
|
42
62
|
cNIO_ByteBuffer = rb_define_class_under(mNIO, "ByteBuffer", rb_cObject);
|
43
63
|
rb_define_alloc_func(cNIO_ByteBuffer, NIO_ByteBuffer_allocate);
|
44
64
|
|
45
|
-
cNIO_ByteBuffer_OverflowError
|
65
|
+
cNIO_ByteBuffer_OverflowError = rb_define_class_under(cNIO_ByteBuffer, "OverflowError", rb_eIOError);
|
46
66
|
cNIO_ByteBuffer_UnderflowError = rb_define_class_under(cNIO_ByteBuffer, "UnderflowError", rb_eIOError);
|
47
67
|
cNIO_ByteBuffer_MarkUnsetError = rb_define_class_under(cNIO_ByteBuffer, "MarkUnsetError", rb_eIOError);
|
48
68
|
|
@@ -72,28 +92,46 @@ void Init_NIO_ByteBuffer()
|
|
72
92
|
rb_define_method(cNIO_ByteBuffer, "inspect", NIO_ByteBuffer_inspect, 0);
|
73
93
|
}
|
74
94
|
|
95
|
+
static const rb_data_type_t NIO_ByteBuffer_type = {
|
96
|
+
"NIO::ByteBuffer",
|
97
|
+
{
|
98
|
+
NULL, // Nothing to mark
|
99
|
+
NIO_ByteBuffer_free,
|
100
|
+
NIO_ByteBuffer_memsize,
|
101
|
+
},
|
102
|
+
0,
|
103
|
+
0,
|
104
|
+
RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
|
105
|
+
};
|
106
|
+
|
75
107
|
static VALUE NIO_ByteBuffer_allocate(VALUE klass)
|
76
108
|
{
|
77
109
|
struct NIO_ByteBuffer *bytebuffer = (struct NIO_ByteBuffer *)xmalloc(sizeof(struct NIO_ByteBuffer));
|
78
110
|
bytebuffer->buffer = NULL;
|
79
|
-
return
|
111
|
+
return TypedData_Wrap_Struct(klass, &NIO_ByteBuffer_type, bytebuffer);
|
80
112
|
}
|
81
113
|
|
82
|
-
static void
|
114
|
+
static void NIO_ByteBuffer_free(void *data)
|
83
115
|
{
|
116
|
+
struct NIO_ByteBuffer *buffer = (struct NIO_ByteBuffer *)data;
|
117
|
+
if (buffer->buffer)
|
118
|
+
xfree(buffer->buffer);
|
119
|
+
xfree(buffer);
|
84
120
|
}
|
85
121
|
|
86
|
-
static
|
122
|
+
static size_t NIO_ByteBuffer_memsize(const void *data)
|
87
123
|
{
|
88
|
-
|
89
|
-
|
90
|
-
|
124
|
+
const struct NIO_ByteBuffer *buffer = (const struct NIO_ByteBuffer *)data;
|
125
|
+
size_t memsize = sizeof(struct NIO_ByteBuffer);
|
126
|
+
if (buffer->buffer)
|
127
|
+
memsize += buffer->capacity;
|
128
|
+
return memsize;
|
91
129
|
}
|
92
130
|
|
93
131
|
static VALUE NIO_ByteBuffer_initialize(VALUE self, VALUE capacity)
|
94
132
|
{
|
95
133
|
struct NIO_ByteBuffer *buffer;
|
96
|
-
|
134
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
97
135
|
|
98
136
|
buffer->capacity = NUM2INT(capacity);
|
99
137
|
buffer->buffer = xmalloc(buffer->capacity);
|
@@ -106,7 +144,7 @@ static VALUE NIO_ByteBuffer_initialize(VALUE self, VALUE capacity)
|
|
106
144
|
static VALUE NIO_ByteBuffer_clear(VALUE self)
|
107
145
|
{
|
108
146
|
struct NIO_ByteBuffer *buffer;
|
109
|
-
|
147
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
110
148
|
|
111
149
|
memset(buffer->buffer, 0, buffer->capacity);
|
112
150
|
|
@@ -120,7 +158,7 @@ static VALUE NIO_ByteBuffer_clear(VALUE self)
|
|
120
158
|
static VALUE NIO_ByteBuffer_get_position(VALUE self)
|
121
159
|
{
|
122
160
|
struct NIO_ByteBuffer *buffer;
|
123
|
-
|
161
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
124
162
|
|
125
163
|
return INT2NUM(buffer->position);
|
126
164
|
}
|
@@ -129,21 +167,21 @@ static VALUE NIO_ByteBuffer_set_position(VALUE self, VALUE new_position)
|
|
129
167
|
{
|
130
168
|
int pos;
|
131
169
|
struct NIO_ByteBuffer *buffer;
|
132
|
-
|
170
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
133
171
|
|
134
172
|
pos = NUM2INT(new_position);
|
135
173
|
|
136
|
-
if(pos < 0) {
|
174
|
+
if (pos < 0) {
|
137
175
|
rb_raise(rb_eArgError, "negative position given");
|
138
176
|
}
|
139
177
|
|
140
|
-
if(pos > buffer->limit) {
|
178
|
+
if (pos > buffer->limit) {
|
141
179
|
rb_raise(rb_eArgError, "specified position exceeds limit");
|
142
180
|
}
|
143
181
|
|
144
182
|
buffer->position = pos;
|
145
183
|
|
146
|
-
if(buffer->mark > buffer->position) {
|
184
|
+
if (buffer->mark > buffer->position) {
|
147
185
|
buffer->mark = MARK_UNSET;
|
148
186
|
}
|
149
187
|
|
@@ -153,7 +191,7 @@ static VALUE NIO_ByteBuffer_set_position(VALUE self, VALUE new_position)
|
|
153
191
|
static VALUE NIO_ByteBuffer_get_limit(VALUE self)
|
154
192
|
{
|
155
193
|
struct NIO_ByteBuffer *buffer;
|
156
|
-
|
194
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
157
195
|
|
158
196
|
return INT2NUM(buffer->limit);
|
159
197
|
}
|
@@ -162,25 +200,25 @@ static VALUE NIO_ByteBuffer_set_limit(VALUE self, VALUE new_limit)
|
|
162
200
|
{
|
163
201
|
int lim;
|
164
202
|
struct NIO_ByteBuffer *buffer;
|
165
|
-
|
203
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
166
204
|
|
167
205
|
lim = NUM2INT(new_limit);
|
168
206
|
|
169
|
-
if(lim < 0) {
|
207
|
+
if (lim < 0) {
|
170
208
|
rb_raise(rb_eArgError, "negative limit given");
|
171
209
|
}
|
172
210
|
|
173
|
-
if(lim > buffer->capacity) {
|
211
|
+
if (lim > buffer->capacity) {
|
174
212
|
rb_raise(rb_eArgError, "specified limit exceeds capacity");
|
175
213
|
}
|
176
214
|
|
177
215
|
buffer->limit = lim;
|
178
216
|
|
179
|
-
if(buffer->position > lim) {
|
217
|
+
if (buffer->position > lim) {
|
180
218
|
buffer->position = lim;
|
181
219
|
}
|
182
220
|
|
183
|
-
if(buffer->mark > lim) {
|
221
|
+
if (buffer->mark > lim) {
|
184
222
|
buffer->mark = MARK_UNSET;
|
185
223
|
}
|
186
224
|
|
@@ -190,7 +228,7 @@ static VALUE NIO_ByteBuffer_set_limit(VALUE self, VALUE new_limit)
|
|
190
228
|
static VALUE NIO_ByteBuffer_capacity(VALUE self)
|
191
229
|
{
|
192
230
|
struct NIO_ByteBuffer *buffer;
|
193
|
-
|
231
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
194
232
|
|
195
233
|
return INT2NUM(buffer->capacity);
|
196
234
|
}
|
@@ -198,7 +236,7 @@ static VALUE NIO_ByteBuffer_capacity(VALUE self)
|
|
198
236
|
static VALUE NIO_ByteBuffer_remaining(VALUE self)
|
199
237
|
{
|
200
238
|
struct NIO_ByteBuffer *buffer;
|
201
|
-
|
239
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
202
240
|
|
203
241
|
return INT2NUM(buffer->limit - buffer->position);
|
204
242
|
}
|
@@ -206,7 +244,7 @@ static VALUE NIO_ByteBuffer_remaining(VALUE self)
|
|
206
244
|
static VALUE NIO_ByteBuffer_full(VALUE self)
|
207
245
|
{
|
208
246
|
struct NIO_ByteBuffer *buffer;
|
209
|
-
|
247
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
210
248
|
|
211
249
|
return buffer->position == buffer->limit ? Qtrue : Qfalse;
|
212
250
|
}
|
@@ -216,21 +254,21 @@ static VALUE NIO_ByteBuffer_get(int argc, VALUE *argv, VALUE self)
|
|
216
254
|
int len;
|
217
255
|
VALUE length, result;
|
218
256
|
struct NIO_ByteBuffer *buffer;
|
219
|
-
|
257
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
220
258
|
|
221
259
|
rb_scan_args(argc, argv, "01", &length);
|
222
260
|
|
223
|
-
if(length == Qnil) {
|
261
|
+
if (length == Qnil) {
|
224
262
|
len = buffer->limit - buffer->position;
|
225
263
|
} else {
|
226
264
|
len = NUM2INT(length);
|
227
265
|
}
|
228
266
|
|
229
|
-
if(len < 0) {
|
267
|
+
if (len < 0) {
|
230
268
|
rb_raise(rb_eArgError, "negative length given");
|
231
269
|
}
|
232
270
|
|
233
|
-
if(len > buffer->limit - buffer->position) {
|
271
|
+
if (len > buffer->limit - buffer->position) {
|
234
272
|
rb_raise(cNIO_ByteBuffer_UnderflowError, "not enough data in buffer");
|
235
273
|
}
|
236
274
|
|
@@ -244,15 +282,15 @@ static VALUE NIO_ByteBuffer_fetch(VALUE self, VALUE index)
|
|
244
282
|
{
|
245
283
|
int i;
|
246
284
|
struct NIO_ByteBuffer *buffer;
|
247
|
-
|
285
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
248
286
|
|
249
287
|
i = NUM2INT(index);
|
250
288
|
|
251
|
-
if(i < 0) {
|
289
|
+
if (i < 0) {
|
252
290
|
rb_raise(rb_eArgError, "negative index given");
|
253
291
|
}
|
254
292
|
|
255
|
-
if(i >= buffer->limit) {
|
293
|
+
if (i >= buffer->limit) {
|
256
294
|
rb_raise(rb_eArgError, "specified index exceeds limit");
|
257
295
|
}
|
258
296
|
|
@@ -263,12 +301,12 @@ static VALUE NIO_ByteBuffer_put(VALUE self, VALUE string)
|
|
263
301
|
{
|
264
302
|
long length;
|
265
303
|
struct NIO_ByteBuffer *buffer;
|
266
|
-
|
304
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
267
305
|
|
268
306
|
StringValue(string);
|
269
307
|
length = RSTRING_LEN(string);
|
270
308
|
|
271
|
-
if(length > buffer->limit - buffer->position) {
|
309
|
+
if (length > buffer->limit - buffer->position) {
|
272
310
|
rb_raise(cNIO_ByteBuffer_OverflowError, "buffer is full");
|
273
311
|
}
|
274
312
|
|
@@ -281,22 +319,22 @@ static VALUE NIO_ByteBuffer_put(VALUE self, VALUE string)
|
|
281
319
|
static VALUE NIO_ByteBuffer_read_from(VALUE self, VALUE io)
|
282
320
|
{
|
283
321
|
struct NIO_ByteBuffer *buffer;
|
284
|
-
rb_io_t *fptr;
|
285
322
|
ssize_t nbytes, bytes_read;
|
286
323
|
|
287
|
-
|
288
|
-
|
289
|
-
|
324
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
325
|
+
|
326
|
+
io = rb_convert_type(io, T_FILE, "IO", "to_io");
|
327
|
+
io_set_nonblock(io);
|
290
328
|
|
291
329
|
nbytes = buffer->limit - buffer->position;
|
292
|
-
if(nbytes == 0) {
|
330
|
+
if (nbytes == 0) {
|
293
331
|
rb_raise(cNIO_ByteBuffer_OverflowError, "buffer is full");
|
294
332
|
}
|
295
333
|
|
296
|
-
bytes_read = read(
|
334
|
+
bytes_read = read(rb_io_descriptor(io), buffer->buffer + buffer->position, nbytes);
|
297
335
|
|
298
|
-
if(bytes_read < 0) {
|
299
|
-
if(errno == EAGAIN) {
|
336
|
+
if (bytes_read < 0) {
|
337
|
+
if (errno == EAGAIN) {
|
300
338
|
return INT2NUM(0);
|
301
339
|
} else {
|
302
340
|
rb_sys_fail("write");
|
@@ -305,28 +343,27 @@ static VALUE NIO_ByteBuffer_read_from(VALUE self, VALUE io)
|
|
305
343
|
|
306
344
|
buffer->position += bytes_read;
|
307
345
|
|
308
|
-
return
|
346
|
+
return SIZET2NUM(bytes_read);
|
309
347
|
}
|
310
348
|
|
311
349
|
static VALUE NIO_ByteBuffer_write_to(VALUE self, VALUE io)
|
312
350
|
{
|
313
351
|
struct NIO_ByteBuffer *buffer;
|
314
|
-
rb_io_t *fptr;
|
315
352
|
ssize_t nbytes, bytes_written;
|
316
353
|
|
317
|
-
|
318
|
-
|
319
|
-
|
354
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
355
|
+
io = rb_convert_type(io, T_FILE, "IO", "to_io");
|
356
|
+
io_set_nonblock(io);
|
320
357
|
|
321
358
|
nbytes = buffer->limit - buffer->position;
|
322
|
-
if(nbytes == 0) {
|
359
|
+
if (nbytes == 0) {
|
323
360
|
rb_raise(cNIO_ByteBuffer_UnderflowError, "no data remaining in buffer");
|
324
361
|
}
|
325
362
|
|
326
|
-
bytes_written = write(
|
363
|
+
bytes_written = write(rb_io_descriptor(io), buffer->buffer + buffer->position, nbytes);
|
327
364
|
|
328
|
-
if(bytes_written < 0) {
|
329
|
-
if(errno == EAGAIN) {
|
365
|
+
if (bytes_written < 0) {
|
366
|
+
if (errno == EAGAIN) {
|
330
367
|
return INT2NUM(0);
|
331
368
|
} else {
|
332
369
|
rb_sys_fail("write");
|
@@ -335,13 +372,13 @@ static VALUE NIO_ByteBuffer_write_to(VALUE self, VALUE io)
|
|
335
372
|
|
336
373
|
buffer->position += bytes_written;
|
337
374
|
|
338
|
-
return
|
375
|
+
return SIZET2NUM(bytes_written);
|
339
376
|
}
|
340
377
|
|
341
378
|
static VALUE NIO_ByteBuffer_flip(VALUE self)
|
342
379
|
{
|
343
380
|
struct NIO_ByteBuffer *buffer;
|
344
|
-
|
381
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
345
382
|
|
346
383
|
buffer->limit = buffer->position;
|
347
384
|
buffer->position = 0;
|
@@ -353,7 +390,7 @@ static VALUE NIO_ByteBuffer_flip(VALUE self)
|
|
353
390
|
static VALUE NIO_ByteBuffer_rewind(VALUE self)
|
354
391
|
{
|
355
392
|
struct NIO_ByteBuffer *buffer;
|
356
|
-
|
393
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
357
394
|
|
358
395
|
buffer->position = 0;
|
359
396
|
buffer->mark = MARK_UNSET;
|
@@ -364,7 +401,7 @@ static VALUE NIO_ByteBuffer_rewind(VALUE self)
|
|
364
401
|
static VALUE NIO_ByteBuffer_mark(VALUE self)
|
365
402
|
{
|
366
403
|
struct NIO_ByteBuffer *buffer;
|
367
|
-
|
404
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
368
405
|
|
369
406
|
buffer->mark = buffer->position;
|
370
407
|
return self;
|
@@ -373,9 +410,9 @@ static VALUE NIO_ByteBuffer_mark(VALUE self)
|
|
373
410
|
static VALUE NIO_ByteBuffer_reset(VALUE self)
|
374
411
|
{
|
375
412
|
struct NIO_ByteBuffer *buffer;
|
376
|
-
|
413
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
377
414
|
|
378
|
-
if(buffer->mark < 0) {
|
415
|
+
if (buffer->mark < 0) {
|
379
416
|
rb_raise(cNIO_ByteBuffer_MarkUnsetError, "mark has not been set");
|
380
417
|
} else {
|
381
418
|
buffer->position = buffer->mark;
|
@@ -387,7 +424,7 @@ static VALUE NIO_ByteBuffer_reset(VALUE self)
|
|
387
424
|
static VALUE NIO_ByteBuffer_compact(VALUE self)
|
388
425
|
{
|
389
426
|
struct NIO_ByteBuffer *buffer;
|
390
|
-
|
427
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
391
428
|
|
392
429
|
memmove(buffer->buffer, buffer->buffer + buffer->position, buffer->limit - buffer->position);
|
393
430
|
buffer->position = buffer->limit - buffer->position;
|
@@ -400,10 +437,10 @@ static VALUE NIO_ByteBuffer_each(VALUE self)
|
|
400
437
|
{
|
401
438
|
int i;
|
402
439
|
struct NIO_ByteBuffer *buffer;
|
403
|
-
|
440
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
404
441
|
|
405
|
-
if(rb_block_given_p()) {
|
406
|
-
for(i = 0; i < buffer->limit; i++) {
|
442
|
+
if (rb_block_given_p()) {
|
443
|
+
for (i = 0; i < buffer->limit; i++) {
|
407
444
|
rb_yield(INT2NUM(buffer->buffer[i]));
|
408
445
|
}
|
409
446
|
} else {
|
@@ -416,14 +453,13 @@ static VALUE NIO_ByteBuffer_each(VALUE self)
|
|
416
453
|
static VALUE NIO_ByteBuffer_inspect(VALUE self)
|
417
454
|
{
|
418
455
|
struct NIO_ByteBuffer *buffer;
|
419
|
-
|
456
|
+
TypedData_Get_Struct(self, struct NIO_ByteBuffer, &NIO_ByteBuffer_type, buffer);
|
420
457
|
|
421
458
|
return rb_sprintf(
|
422
459
|
"#<%s:%p @position=%d @limit=%d @capacity=%d>",
|
423
460
|
rb_class2name(CLASS_OF(self)),
|
424
|
-
(void*)self,
|
461
|
+
(void *)self,
|
425
462
|
buffer->position,
|
426
463
|
buffer->limit,
|
427
|
-
buffer->capacity
|
428
|
-
);
|
464
|
+
buffer->capacity);
|
429
465
|
}
|
data/ext/nio4r/extconf.rb
CHANGED
@@ -1,9 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2011-2020, by Tony Arcieri.
|
5
|
+
# Copyright, 2014, by Hiroshi Shibata.
|
6
|
+
# Copyright, 2014, by Sergey Avseyev.
|
7
|
+
# Copyright, 2015, by Daniel Berger.
|
8
|
+
# Copyright, 2017, by Jun Aruga.
|
9
|
+
# Copyright, 2017, by Usaku Nakamura.
|
10
|
+
# Copyright, 2017, by Lars Kanis.
|
11
|
+
# Copyright, 2019-2023, by Samuel Williams.
|
12
|
+
# Copyright, 2020, by Gregory Longtin.
|
13
|
+
# Copyright, 2020, by Boaz Segev.
|
14
|
+
# Copyright, 2020, by Joao Fernandes.
|
15
|
+
# Copyright, 2021, by Jeffrey Martin.
|
16
|
+
|
3
17
|
require "rubygems"
|
4
18
|
|
5
19
|
# Write a dummy Makefile on Windows because we use the pure Ruby implementation there
|
6
20
|
if Gem.win_platform?
|
21
|
+
begin
|
22
|
+
require "devkit" if RUBY_PLATFORM.include?("mingw")
|
23
|
+
rescue LoadError => e
|
24
|
+
end
|
7
25
|
File.write("Makefile", "all install::\n")
|
8
26
|
File.write("nio4r_ext.so", "")
|
9
27
|
exit
|
@@ -12,8 +30,10 @@ end
|
|
12
30
|
require "mkmf"
|
13
31
|
|
14
32
|
have_header("unistd.h")
|
33
|
+
have_func("rb_io_descriptor")
|
15
34
|
|
16
35
|
$defs << "-DEV_USE_LINUXAIO" if have_header("linux/aio_abi.h")
|
36
|
+
$defs << "-DEV_USE_IOURING" if have_header("linux/io_uring.h")
|
17
37
|
$defs << "-DEV_USE_SELECT" if have_header("sys/select.h")
|
18
38
|
$defs << "-DEV_USE_POLL" if have_type("port_event_t", "poll.h")
|
19
39
|
$defs << "-DEV_USE_EPOLL" if have_header("sys/epoll.h")
|
@@ -21,7 +41,13 @@ $defs << "-DEV_USE_KQUEUE" if have_header("sys/event.h") && have_header("s
|
|
21
41
|
$defs << "-DEV_USE_PORT" if have_type("port_event_t", "port.h")
|
22
42
|
$defs << "-DHAVE_SYS_RESOURCE_H" if have_header("sys/resource.h")
|
23
43
|
|
44
|
+
$defs << "-DEV_STANDALONE" # prevent libev from assuming "config.h" exists
|
45
|
+
|
24
46
|
CONFIG["optflags"] << " -fno-strict-aliasing" unless RUBY_PLATFORM =~ /mswin/
|
25
47
|
|
48
|
+
if RUBY_PLATFORM =~ /darwin/
|
49
|
+
$DLDFLAGS.gsub!(/\-arch\s+[^\s]+/, "")
|
50
|
+
end
|
51
|
+
|
26
52
|
dir_config "nio4r_ext"
|
27
53
|
create_makefile "nio4r_ext"
|
data/ext/nio4r/libev.h
CHANGED