polyphony 0.93 → 0.94
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +8 -12
- data/examples/pipes/echo_server.rb +1 -1
- data/examples/pipes/http_server.rb +33 -0
- data/ext/polyphony/backend_common.c +50 -5
- data/ext/polyphony/backend_common.h +21 -13
- data/ext/polyphony/backend_io_uring.c +67 -131
- data/ext/polyphony/backend_libev.c +58 -89
- data/ext/polyphony/extconf.rb +2 -2
- data/ext/polyphony/io_extensions.c +67 -67
- data/ext/polyphony/polyphony.c +22 -22
- data/ext/polyphony/polyphony.h +0 -9
- data/lib/polyphony/version.rb +1 -1
- data/test/test_global_api.rb +1 -1
- metadata +8 -7
@@ -114,30 +114,30 @@ static inline enum write_method detect_write_method(VALUE io) {
|
|
114
114
|
#endif
|
115
115
|
|
116
116
|
|
117
|
-
static inline int read_to_raw_buffer(VALUE backend, VALUE io, enum read_method method, struct
|
117
|
+
static inline int read_to_raw_buffer(VALUE backend, VALUE io, enum read_method method, struct buffer_spec *buffer_spec) {
|
118
118
|
switch (method) {
|
119
119
|
case RM_BACKEND_READ: {
|
120
|
-
VALUE len = Backend_read(backend, io, PTR2FIX(
|
120
|
+
VALUE len = Backend_read(backend, io, PTR2FIX(buffer_spec), Qnil, Qfalse, INT2FIX(0));
|
121
121
|
return (len == Qnil) ? 0 : FIX2INT(len);
|
122
122
|
}
|
123
123
|
case RM_BACKEND_RECV: {
|
124
|
-
VALUE len = Backend_recv(backend, io, PTR2FIX(
|
124
|
+
VALUE len = Backend_recv(backend, io, PTR2FIX(buffer_spec), Qnil, INT2FIX(0));
|
125
125
|
return (len == Qnil) ? 0 : FIX2INT(len);
|
126
126
|
}
|
127
127
|
case RM_READPARTIAL: {
|
128
|
-
VALUE str = rb_funcall(io, ID_readpartial, 1, INT2FIX(
|
128
|
+
VALUE str = rb_funcall(io, ID_readpartial, 1, INT2FIX(buffer_spec->len));
|
129
129
|
int len = RSTRING_LEN(str);
|
130
|
-
if (len) memcpy(
|
130
|
+
if (len) memcpy(buffer_spec->ptr, RSTRING_PTR(str), len);
|
131
131
|
RB_GC_GUARD(str);
|
132
132
|
return len;
|
133
133
|
}
|
134
134
|
case RM_CALL: {
|
135
|
-
VALUE str = rb_funcall(io, ID_call, INT2FIX(
|
135
|
+
VALUE str = rb_funcall(io, ID_call, INT2FIX(buffer_spec->len));
|
136
136
|
if (TYPE(str) != T_STRING)
|
137
137
|
rb_raise(rb_eRuntimeError, "io#call must return a string");
|
138
138
|
int len = RSTRING_LEN(str);
|
139
|
-
if (len >
|
140
|
-
if (len) memcpy(
|
139
|
+
if (len > buffer_spec->len) len = buffer_spec->len;
|
140
|
+
if (len) memcpy(buffer_spec->ptr, RSTRING_PTR(str), len);
|
141
141
|
RB_GC_GUARD(str);
|
142
142
|
return len;
|
143
143
|
}
|
@@ -147,35 +147,35 @@ static inline int read_to_raw_buffer(VALUE backend, VALUE io, enum read_method m
|
|
147
147
|
}
|
148
148
|
}
|
149
149
|
|
150
|
-
static inline int write_from_raw_buffer(VALUE backend, VALUE io, enum write_method method, struct
|
150
|
+
static inline int write_from_raw_buffer(VALUE backend, VALUE io, enum write_method method, struct buffer_spec *buffer_spec) {
|
151
151
|
switch (method) {
|
152
152
|
case WM_STRING: {
|
153
|
-
rb_str_buf_cat(io, (char *)
|
154
|
-
return
|
153
|
+
rb_str_buf_cat(io, (char *)buffer_spec->ptr, buffer_spec->len);
|
154
|
+
return buffer_spec->len;
|
155
155
|
}
|
156
156
|
case WM_BACKEND_WRITE: {
|
157
|
-
VALUE len = Backend_write(backend, io, PTR2FIX(
|
157
|
+
VALUE len = Backend_write(backend, io, PTR2FIX(buffer_spec));
|
158
158
|
return FIX2INT(len);
|
159
159
|
}
|
160
160
|
case WM_BACKEND_SEND: {
|
161
|
-
VALUE len = Backend_send(backend, io, PTR2FIX(
|
161
|
+
VALUE len = Backend_send(backend, io, PTR2FIX(buffer_spec), INT2FIX(0));
|
162
162
|
return FIX2INT(len);
|
163
163
|
}
|
164
164
|
case WM_WRITE: {
|
165
|
-
VALUE str = rb_str_new(0,
|
166
|
-
memcpy(RSTRING_PTR(str),
|
167
|
-
rb_str_modify_expand(str,
|
165
|
+
VALUE str = rb_str_new(0, buffer_spec->len);
|
166
|
+
memcpy(RSTRING_PTR(str), buffer_spec->ptr, buffer_spec->len);
|
167
|
+
rb_str_modify_expand(str, buffer_spec->len);
|
168
168
|
rb_funcall(io, ID_write, 1, str);
|
169
169
|
RB_GC_GUARD(str);
|
170
|
-
return
|
170
|
+
return buffer_spec->len;
|
171
171
|
}
|
172
172
|
case WM_CALL: {
|
173
|
-
VALUE str = rb_str_new(0,
|
174
|
-
memcpy(RSTRING_PTR(str),
|
175
|
-
rb_str_modify_expand(str,
|
173
|
+
VALUE str = rb_str_new(0, buffer_spec->len);
|
174
|
+
memcpy(RSTRING_PTR(str), buffer_spec->ptr, buffer_spec->len);
|
175
|
+
rb_str_modify_expand(str, buffer_spec->len);
|
176
176
|
rb_funcall(io, ID_call, 1, str);
|
177
177
|
RB_GC_GUARD(str);
|
178
|
-
return
|
178
|
+
return buffer_spec->len;
|
179
179
|
}
|
180
180
|
default: {
|
181
181
|
rb_raise(rb_eRuntimeError, "Invalid write method");
|
@@ -183,16 +183,16 @@ static inline int write_from_raw_buffer(VALUE backend, VALUE io, enum write_meth
|
|
183
183
|
}
|
184
184
|
}
|
185
185
|
|
186
|
-
static inline int write_c_string_from_str(VALUE str, struct
|
186
|
+
static inline int write_c_string_from_str(VALUE str, struct buffer_spec *buffer_spec) {
|
187
187
|
int strlen = RSTRING_LEN(str);
|
188
|
-
if (strlen >=
|
188
|
+
if (strlen >= buffer_spec->len)
|
189
189
|
rb_raise(rb_eRuntimeError, "string too long to fit in gzip header buffer");
|
190
190
|
|
191
|
-
memcpy(
|
192
|
-
|
191
|
+
memcpy(buffer_spec->ptr, RSTRING_PTR(str), strlen);
|
192
|
+
buffer_spec->ptr[strlen] = 0;
|
193
193
|
int written = strlen + 1;
|
194
|
-
|
195
|
-
|
194
|
+
buffer_spec->ptr += written;
|
195
|
+
buffer_spec->len -= written;
|
196
196
|
return written;
|
197
197
|
}
|
198
198
|
|
@@ -265,7 +265,7 @@ int gzip_prepare_header(struct gzip_header_ctx *ctx, unsigned char *buffer, int
|
|
265
265
|
|
266
266
|
len = 10;
|
267
267
|
|
268
|
-
struct
|
268
|
+
struct buffer_spec buffer_spec = {buffer + len, maxlen - len};
|
269
269
|
if (!NIL_P(ctx->orig_name))
|
270
270
|
len += write_c_string_from_str(ctx->orig_name, &buffer_spec);
|
271
271
|
if (!NIL_P(ctx->comment))
|
@@ -312,54 +312,54 @@ struct z_stream_ctx {
|
|
312
312
|
|
313
313
|
typedef int (*zlib_func)(z_streamp, int);
|
314
314
|
|
315
|
-
void read_gzip_header_str(struct
|
315
|
+
void read_gzip_header_str(struct buffer_spec *buffer_spec, VALUE *str, unsigned int *in_pos, unsigned long *total_read) {
|
316
316
|
unsigned long null_pos;
|
317
317
|
// find null terminator
|
318
318
|
for (null_pos = *in_pos; null_pos < *total_read; null_pos++) {
|
319
|
-
if (!
|
319
|
+
if (!buffer_spec->ptr[null_pos]) break;
|
320
320
|
}
|
321
321
|
if (null_pos == *total_read)
|
322
322
|
rb_raise(rb_eRuntimeError, "Invalid gzip header");
|
323
323
|
|
324
|
-
*str = rb_str_new_cstr((char *)
|
324
|
+
*str = rb_str_new_cstr((char *)buffer_spec->ptr + *in_pos);
|
325
325
|
*in_pos = null_pos + 1;
|
326
326
|
}
|
327
327
|
|
328
328
|
void gzip_read_header(struct z_stream_ctx *ctx, struct gzip_header_ctx *header_ctx) {
|
329
|
-
struct
|
329
|
+
struct buffer_spec in_buffer_spec;
|
330
330
|
int flags;
|
331
331
|
|
332
332
|
if (ctx->src_read_method == RM_STRING) {
|
333
|
-
|
334
|
-
|
335
|
-
ctx->in_total =
|
333
|
+
in_buffer_spec.ptr = (unsigned char *)RSTRING_PTR(ctx->src);
|
334
|
+
in_buffer_spec.len = RSTRING_LEN(ctx->src);
|
335
|
+
ctx->in_total = in_buffer_spec.len;
|
336
336
|
}
|
337
337
|
else {
|
338
|
-
|
339
|
-
|
338
|
+
in_buffer_spec.ptr = ctx->in;
|
339
|
+
in_buffer_spec.len = CHUNK;
|
340
340
|
while (ctx->in_total < 10) {
|
341
|
-
int read = read_to_raw_buffer(ctx->backend, ctx->src, ctx->src_read_method, &
|
341
|
+
int read = read_to_raw_buffer(ctx->backend, ctx->src, ctx->src_read_method, &in_buffer_spec);
|
342
342
|
if (read == 0) goto error;
|
343
343
|
ctx->in_total += read;
|
344
344
|
}
|
345
345
|
}
|
346
346
|
|
347
347
|
// PRINT_BUFFER("read gzip header", ctx->in, ctx->in_total);
|
348
|
-
if (
|
349
|
-
if (
|
350
|
-
if (
|
351
|
-
flags =
|
348
|
+
if (in_buffer_spec.ptr[0] != GZ_MAGIC1) goto error;
|
349
|
+
if (in_buffer_spec.ptr[1] != GZ_MAGIC2) goto error;
|
350
|
+
if (in_buffer_spec.ptr[2] != GZ_METHOD_DEFLATE) goto error;
|
351
|
+
flags = in_buffer_spec.ptr[3];
|
352
352
|
|
353
|
-
unsigned long mtime = gzfile_get32(
|
353
|
+
unsigned long mtime = gzfile_get32(in_buffer_spec.ptr + 4);
|
354
354
|
header_ctx->mtime = INT2FIX(mtime);
|
355
355
|
ctx->in_pos = 10;
|
356
356
|
|
357
357
|
if (flags & GZ_FLAG_ORIG_NAME)
|
358
|
-
read_gzip_header_str(&
|
358
|
+
read_gzip_header_str(&in_buffer_spec, &header_ctx->orig_name, &ctx->in_pos, &ctx->in_total);
|
359
359
|
else
|
360
360
|
header_ctx->orig_name = Qnil;
|
361
361
|
if (flags & GZ_FLAG_COMMENT)
|
362
|
-
read_gzip_header_str(&
|
362
|
+
read_gzip_header_str(&in_buffer_spec, &header_ctx->comment, &ctx->in_pos, &ctx->in_total);
|
363
363
|
else
|
364
364
|
header_ctx->comment = Qnil;
|
365
365
|
return;
|
@@ -391,25 +391,25 @@ static inline int process_without_gvl(zlib_func fun, z_stream *strm, int flags)
|
|
391
391
|
static inline int z_stream_write_out(struct z_stream_ctx *ctx, zlib_func fun, int eof) {
|
392
392
|
int ret;
|
393
393
|
int written;
|
394
|
-
struct
|
394
|
+
struct buffer_spec out_buffer_spec;
|
395
395
|
|
396
396
|
int avail_out_pre = ctx->strm.avail_out = CHUNK - ctx->out_pos;
|
397
397
|
ctx->strm.next_out = ctx->out + ctx->out_pos;
|
398
398
|
ret = process_without_gvl(fun, &ctx->strm, eof ? Z_FINISH : Z_NO_FLUSH);
|
399
399
|
assert(ret != Z_STREAM_ERROR);
|
400
400
|
written = avail_out_pre - ctx->strm.avail_out;
|
401
|
-
|
402
|
-
|
401
|
+
out_buffer_spec.ptr = ctx->out;
|
402
|
+
out_buffer_spec.len = ctx->out_pos + written;
|
403
403
|
|
404
|
-
if (eof && ctx->f_gzip_footer && (CHUNK -
|
405
|
-
gzip_prepare_footer(ctx->crc32, ctx->in_total,
|
406
|
-
|
404
|
+
if (eof && ctx->f_gzip_footer && (CHUNK - out_buffer_spec.len >= GZIP_FOOTER_LEN)) {
|
405
|
+
gzip_prepare_footer(ctx->crc32, ctx->in_total, out_buffer_spec.ptr + out_buffer_spec.len, 8);
|
406
|
+
out_buffer_spec.len += GZIP_FOOTER_LEN;
|
407
407
|
}
|
408
408
|
|
409
|
-
if (
|
410
|
-
ret = write_from_raw_buffer(ctx->backend, ctx->dest, ctx->dest_write_method, &
|
409
|
+
if (out_buffer_spec.len) {
|
410
|
+
ret = write_from_raw_buffer(ctx->backend, ctx->dest, ctx->dest_write_method, &out_buffer_spec);
|
411
411
|
if (ctx->mode == SM_INFLATE)
|
412
|
-
ctx->crc32 = crc32(ctx->crc32,
|
412
|
+
ctx->crc32 = crc32(ctx->crc32, out_buffer_spec.ptr + ctx->out_pos, written);
|
413
413
|
ctx->out_total += ret - ctx->out_pos;
|
414
414
|
}
|
415
415
|
ctx->out_pos = 0;
|
@@ -437,19 +437,19 @@ VALUE z_stream_io_loop(struct z_stream_ctx *ctx) {
|
|
437
437
|
int eof;
|
438
438
|
int read_len;
|
439
439
|
if (ctx->src_read_method == RM_STRING) {
|
440
|
-
struct
|
440
|
+
struct buffer_spec in_buffer_spec = {
|
441
441
|
(unsigned char *)RSTRING_PTR(ctx->src) + ctx->in_pos,
|
442
442
|
RSTRING_LEN(ctx->src) - ctx->in_pos
|
443
443
|
};
|
444
|
-
ctx->strm.next_in =
|
445
|
-
read_len = ctx->strm.avail_in =
|
444
|
+
ctx->strm.next_in = in_buffer_spec.ptr;
|
445
|
+
read_len = ctx->strm.avail_in = in_buffer_spec.len;
|
446
446
|
eof = 1;
|
447
|
-
if (ctx->mode == SM_DEFLATE) ctx->crc32 = crc32(ctx->crc32,
|
447
|
+
if (ctx->mode == SM_DEFLATE) ctx->crc32 = crc32(ctx->crc32, in_buffer_spec.ptr, read_len);
|
448
448
|
}
|
449
449
|
else {
|
450
|
-
struct
|
450
|
+
struct buffer_spec in_buffer_spec = {ctx->in, CHUNK};
|
451
451
|
ctx->strm.next_in = ctx->in;
|
452
|
-
read_len = ctx->strm.avail_in = read_to_raw_buffer(ctx->backend, ctx->src, ctx->src_read_method, &
|
452
|
+
read_len = ctx->strm.avail_in = read_to_raw_buffer(ctx->backend, ctx->src, ctx->src_read_method, &in_buffer_spec);
|
453
453
|
if (!read_len) break;
|
454
454
|
eof = read_len < CHUNK;
|
455
455
|
if (ctx->mode == SM_DEFLATE) ctx->crc32 = crc32(ctx->crc32, ctx->in, read_len);
|
@@ -606,24 +606,24 @@ VALUE IO_http1_splice_chunked(VALUE self, VALUE src, VALUE dest, VALUE maxlen) {
|
|
606
606
|
VALUE backend = BACKEND();
|
607
607
|
VALUE pipe = rb_funcall(cPipe, ID_new, 0);
|
608
608
|
unsigned char out[128];
|
609
|
-
struct
|
609
|
+
struct buffer_spec buffer_spec = { out, 0 };
|
610
610
|
|
611
611
|
while (1) {
|
612
612
|
int len = FIX2INT(Backend_splice(backend, src, pipe, maxlen));
|
613
613
|
if (!len) break;
|
614
614
|
|
615
615
|
// write chunk header
|
616
|
-
|
617
|
-
write_from_raw_buffer(backend, dest, method, &
|
618
|
-
|
616
|
+
buffer_spec.len += sprintf((char *)buffer_spec.ptr + buffer_spec.len, "%x\r\n", len);
|
617
|
+
write_from_raw_buffer(backend, dest, method, &buffer_spec);
|
618
|
+
buffer_spec.len = 0;
|
619
619
|
while (len) {
|
620
620
|
int spliced = FIX2INT(Backend_splice(backend, pipe, dest, INT2FIX(len)));
|
621
621
|
len -= spliced;
|
622
622
|
}
|
623
|
-
|
623
|
+
buffer_spec.len += sprintf((char *)buffer_spec.ptr + buffer_spec.len, "\r\n");
|
624
624
|
}
|
625
|
-
|
626
|
-
write_from_raw_buffer(backend, dest, method, &
|
625
|
+
buffer_spec.len += sprintf((char *)buffer_spec.ptr + buffer_spec.len, "0\r\n\r\n");
|
626
|
+
write_from_raw_buffer(backend, dest, method, &buffer_spec);
|
627
627
|
|
628
628
|
Pipe_close(pipe);
|
629
629
|
RB_GC_GUARD(pipe);
|
data/ext/polyphony/polyphony.c
CHANGED
@@ -54,16 +54,16 @@ VALUE Polyphony_backend_feed_loop(VALUE self, VALUE io, VALUE receiver, VALUE me
|
|
54
54
|
return Backend_feed_loop(BACKEND(), io, receiver, method);
|
55
55
|
}
|
56
56
|
|
57
|
-
VALUE Polyphony_backend_read(VALUE self, VALUE io, VALUE
|
58
|
-
return Backend_read(BACKEND(), io,
|
57
|
+
VALUE Polyphony_backend_read(VALUE self, VALUE io, VALUE buffer, VALUE length, VALUE to_eof, VALUE pos) {
|
58
|
+
return Backend_read(BACKEND(), io, buffer, length, to_eof, pos);
|
59
59
|
}
|
60
60
|
|
61
61
|
VALUE Polyphony_backend_read_loop(VALUE self, VALUE io, VALUE maxlen) {
|
62
62
|
return Backend_read_loop(BACKEND(), io, maxlen);
|
63
63
|
}
|
64
64
|
|
65
|
-
VALUE Polyphony_backend_recv(VALUE self, VALUE io, VALUE
|
66
|
-
return Backend_recv(BACKEND(), io,
|
65
|
+
VALUE Polyphony_backend_recv(VALUE self, VALUE io, VALUE buffer, VALUE length, VALUE pos) {
|
66
|
+
return Backend_recv(BACKEND(), io, buffer, length, pos);
|
67
67
|
}
|
68
68
|
|
69
69
|
VALUE Polyphony_backend_recv_loop(VALUE self, VALUE io, VALUE maxlen) {
|
@@ -127,14 +127,14 @@ VALUE Polyphony_backend_write(int argc, VALUE *argv, VALUE self) {
|
|
127
127
|
}
|
128
128
|
|
129
129
|
VALUE Polyphony_with_raw_buffer(VALUE self, VALUE size) {
|
130
|
-
struct
|
131
|
-
|
132
|
-
|
133
|
-
if (!
|
130
|
+
struct buffer_spec buffer_spec;
|
131
|
+
buffer_spec.len = FIX2INT(size);
|
132
|
+
buffer_spec.ptr = malloc(buffer_spec.len);
|
133
|
+
if (!buffer_spec.ptr)
|
134
134
|
rb_raise(rb_eRuntimeError, "Failed to allocate buffer");
|
135
135
|
|
136
|
-
VALUE return_value = rb_yield(PTR2FIX(&
|
137
|
-
free(
|
136
|
+
VALUE return_value = rb_yield(PTR2FIX(&buffer_spec));
|
137
|
+
free(buffer_spec.ptr);
|
138
138
|
return return_value;
|
139
139
|
}
|
140
140
|
|
@@ -143,27 +143,27 @@ VALUE Polyphony_raw_buffer_get(int argc, VALUE *argv, VALUE self) {
|
|
143
143
|
VALUE len = Qnil;
|
144
144
|
rb_scan_args(argc, argv, "11", &buf, &len);
|
145
145
|
|
146
|
-
struct
|
147
|
-
int length = (len == Qnil) ?
|
146
|
+
struct buffer_spec *buffer_spec = FIX2PTR(buf);
|
147
|
+
int length = (len == Qnil) ? buffer_spec->len : FIX2INT(len);
|
148
148
|
|
149
|
-
if (length >
|
150
|
-
return rb_utf8_str_new((char *)
|
149
|
+
if (length > buffer_spec->len) length = buffer_spec->len;
|
150
|
+
return rb_utf8_str_new((char *)buffer_spec->ptr, length);
|
151
151
|
}
|
152
152
|
|
153
|
-
VALUE Polyphony_raw_buffer_set(VALUE self, VALUE
|
154
|
-
struct
|
153
|
+
VALUE Polyphony_raw_buffer_set(VALUE self, VALUE buffer, VALUE str) {
|
154
|
+
struct buffer_spec *buffer_spec = FIX2PTR(buffer);
|
155
155
|
int len = RSTRING_LEN(str);
|
156
|
-
if (len >
|
156
|
+
if (len > buffer_spec->len)
|
157
157
|
rb_raise(rb_eRuntimeError, "Given string does not fit in given buffer");
|
158
158
|
|
159
|
-
memcpy(
|
160
|
-
|
159
|
+
memcpy(buffer_spec->ptr, RSTRING_PTR(str), len);
|
160
|
+
buffer_spec->len = len;
|
161
161
|
return self;
|
162
162
|
}
|
163
163
|
|
164
|
-
VALUE Polyphony_raw_buffer_size(VALUE self, VALUE
|
165
|
-
struct
|
166
|
-
return INT2FIX(
|
164
|
+
VALUE Polyphony_raw_buffer_size(VALUE self, VALUE buffer) {
|
165
|
+
struct buffer_spec *buffer_spec = FIX2PTR(buffer);
|
166
|
+
return INT2FIX(buffer_spec->len);
|
167
167
|
}
|
168
168
|
|
169
169
|
// VALUE Polyphony_backend_close(VALUE self, VALUE io) {
|
data/ext/polyphony/polyphony.h
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
#ifndef POLYPHONY_H
|
2
2
|
#define POLYPHONY_H
|
3
3
|
|
4
|
-
#include <execinfo.h>
|
5
|
-
|
6
4
|
#include "ruby.h"
|
7
5
|
#include "runqueue_ring_buffer.h"
|
8
6
|
#include "backend_common.h"
|
@@ -12,13 +10,6 @@
|
|
12
10
|
#define INSPECT(str, obj) { printf(str); VALUE s = rb_funcall(obj, rb_intern("inspect"), 0); printf(": %s\n", StringValueCStr(s)); }
|
13
11
|
#define CALLER() rb_funcall(rb_mKernel, rb_intern("caller"), 0)
|
14
12
|
#define TRACE_CALLER() INSPECT("caller: ", CALLER())
|
15
|
-
#define TRACE_C_STACK() { \
|
16
|
-
void *entries[10]; \
|
17
|
-
size_t size = backtrace(entries, 10); \
|
18
|
-
char **strings = backtrace_symbols(entries, size); \
|
19
|
-
for (unsigned long i = 0; i < size; i++) printf("%s\n", strings[i]); \
|
20
|
-
free(strings); \
|
21
|
-
}
|
22
13
|
|
23
14
|
// exceptions
|
24
15
|
#define TEST_EXCEPTION(ret) (rb_obj_is_kind_of(ret, rb_eException) == Qtrue)
|
data/lib/polyphony/version.rb
CHANGED
data/test/test_global_api.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polyphony
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.94'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -136,7 +136,7 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: 1.1.4
|
139
|
-
description:
|
139
|
+
description:
|
140
140
|
email: sharon@noteflakes.com
|
141
141
|
executables: []
|
142
142
|
extensions:
|
@@ -309,6 +309,7 @@ files:
|
|
309
309
|
- examples/pipes/gunzip.rb
|
310
310
|
- examples/pipes/gzip.rb
|
311
311
|
- examples/pipes/gzip_http_server.rb
|
312
|
+
- examples/pipes/http_server.rb
|
312
313
|
- examples/pipes/tcp_proxy.rb
|
313
314
|
- examples/pipes/tee.rb
|
314
315
|
- ext/libev/Changes
|
@@ -645,7 +646,7 @@ metadata:
|
|
645
646
|
documentation_uri: https://digital-fabric.github.io/polyphony/
|
646
647
|
homepage_uri: https://digital-fabric.github.io/polyphony/
|
647
648
|
changelog_uri: https://github.com/digital-fabric/polyphony/blob/master/CHANGELOG.md
|
648
|
-
post_install_message:
|
649
|
+
post_install_message:
|
649
650
|
rdoc_options:
|
650
651
|
- "--title"
|
651
652
|
- polyphony
|
@@ -664,8 +665,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
664
665
|
- !ruby/object:Gem::Version
|
665
666
|
version: '0'
|
666
667
|
requirements: []
|
667
|
-
rubygems_version: 3.3.
|
668
|
-
signing_key:
|
668
|
+
rubygems_version: 3.3.7
|
669
|
+
signing_key:
|
669
670
|
specification_version: 4
|
670
671
|
summary: Fine grained concurrency for Ruby
|
671
672
|
test_files: []
|