polyphony 0.43 → 0.43.5
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/test.yml +1 -1
- data/CHANGELOG.md +29 -0
- data/Gemfile.lock +2 -2
- data/README.md +0 -1
- data/docs/_sass/custom/custom.scss +10 -0
- data/docs/favicon.ico +0 -0
- data/docs/getting-started/overview.md +2 -2
- data/docs/index.md +6 -3
- data/docs/main-concepts/design-principles.md +23 -34
- data/docs/main-concepts/fiber-scheduling.md +1 -1
- data/docs/polyphony-logo.png +0 -0
- data/examples/adapters/concurrent-ruby.rb +9 -0
- data/examples/adapters/redis_blpop.rb +12 -0
- data/examples/core/xx-daemon.rb +14 -0
- data/examples/performance/mem-usage.rb +34 -28
- data/examples/performance/messaging.rb +29 -0
- data/examples/performance/multi_snooze.rb +11 -9
- data/ext/polyphony/libev_agent.c +181 -151
- data/ext/polyphony/libev_queue.c +129 -57
- data/ext/polyphony/polyphony.c +0 -6
- data/ext/polyphony/polyphony.h +12 -5
- data/ext/polyphony/polyphony_ext.c +0 -2
- data/ext/polyphony/ring_buffer.c +120 -0
- data/ext/polyphony/ring_buffer.h +28 -0
- data/ext/polyphony/thread.c +13 -13
- data/lib/polyphony.rb +26 -10
- data/lib/polyphony/adapters/redis.rb +3 -2
- data/lib/polyphony/core/global_api.rb +5 -3
- data/lib/polyphony/core/resource_pool.rb +19 -9
- data/lib/polyphony/core/thread_pool.rb +1 -1
- data/lib/polyphony/extensions/core.rb +40 -0
- data/lib/polyphony/extensions/fiber.rb +8 -13
- data/lib/polyphony/extensions/io.rb +17 -16
- data/lib/polyphony/extensions/socket.rb +12 -2
- data/lib/polyphony/version.rb +1 -1
- data/test/q.rb +24 -0
- data/test/test_agent.rb +13 -7
- data/test/test_fiber.rb +3 -3
- data/test/test_global_api.rb +50 -17
- data/test/test_io.rb +10 -2
- data/test/test_queue.rb +26 -1
- data/test/test_resource_pool.rb +12 -0
- data/test/test_throttler.rb +6 -5
- metadata +11 -3
- data/ext/polyphony/socket.c +0 -213
data/ext/polyphony/socket.c
DELETED
@@ -1,213 +0,0 @@
|
|
1
|
-
#include "polyphony.h"
|
2
|
-
#include <sys/socket.h>
|
3
|
-
|
4
|
-
static VALUE cTCPSocket;
|
5
|
-
|
6
|
-
///////////////////////////////////////////////////////////////////////////
|
7
|
-
|
8
|
-
struct rsock_send_arg {
|
9
|
-
int fd, flags;
|
10
|
-
VALUE mesg;
|
11
|
-
struct sockaddr *to;
|
12
|
-
socklen_t tolen;
|
13
|
-
};
|
14
|
-
|
15
|
-
#define StringValue(v) rb_string_value(&(v))
|
16
|
-
#define IS_ADDRINFO(obj) rb_typeddata_is_kind_of((obj), &addrinfo_type)
|
17
|
-
|
18
|
-
VALUE
|
19
|
-
rsock_sockaddr_string_value(volatile VALUE *v)
|
20
|
-
{
|
21
|
-
// VALUE val = *v;
|
22
|
-
// if (IS_ADDRINFO(val)) {
|
23
|
-
// *v = addrinfo_to_sockaddr(val);
|
24
|
-
// }
|
25
|
-
StringValue(*v);
|
26
|
-
return *v;
|
27
|
-
}
|
28
|
-
|
29
|
-
#define SockAddrStringValue(v) rsock_sockaddr_string_value(&(v))
|
30
|
-
#define RSTRING_LENINT(str) rb_long2int(RSTRING_LEN(str))
|
31
|
-
#ifndef RSTRING_SOCKLEN
|
32
|
-
# define RSTRING_SOCKLEN (socklen_t)RSTRING_LENINT
|
33
|
-
#endif
|
34
|
-
|
35
|
-
#if defined __APPLE__
|
36
|
-
# define do_write_retry(code) do {ret = code;} while (ret == -1 && errno == EPROTOTYPE)
|
37
|
-
#else
|
38
|
-
# define do_write_retry(code) ret = code
|
39
|
-
#endif
|
40
|
-
|
41
|
-
VALUE
|
42
|
-
rsock_sendto_blocking(void *data)
|
43
|
-
{
|
44
|
-
struct rsock_send_arg *arg = data;
|
45
|
-
VALUE mesg = arg->mesg;
|
46
|
-
ssize_t ret;
|
47
|
-
do_write_retry(sendto(arg->fd, RSTRING_PTR(mesg), RSTRING_LEN(mesg),
|
48
|
-
arg->flags, arg->to, arg->tolen));
|
49
|
-
return (VALUE)ret;
|
50
|
-
}
|
51
|
-
|
52
|
-
VALUE
|
53
|
-
rsock_send_blocking(void *data)
|
54
|
-
{
|
55
|
-
struct rsock_send_arg *arg = data;
|
56
|
-
VALUE mesg = arg->mesg;
|
57
|
-
ssize_t ret;
|
58
|
-
do_write_retry(send(arg->fd, RSTRING_PTR(mesg), RSTRING_LEN(mesg),
|
59
|
-
arg->flags));
|
60
|
-
return (VALUE)ret;
|
61
|
-
}
|
62
|
-
|
63
|
-
///////////////////////////////////////////////////////////////////////////
|
64
|
-
|
65
|
-
static VALUE BasicSocket_send(int argc, VALUE *argv, VALUE sock) {
|
66
|
-
VALUE underlying_socket = rb_iv_get(sock, "@io");
|
67
|
-
if (!NIL_P(underlying_socket)) sock = underlying_socket;
|
68
|
-
struct rsock_send_arg arg;
|
69
|
-
VALUE flags, to;
|
70
|
-
rb_io_t *fptr;
|
71
|
-
ssize_t n;
|
72
|
-
rb_blocking_function_t *func;
|
73
|
-
const char *funcname;
|
74
|
-
VALUE agent = Qnil;
|
75
|
-
|
76
|
-
rb_scan_args(argc, argv, "21", &arg.mesg, &flags, &to);
|
77
|
-
|
78
|
-
StringValue(arg.mesg);
|
79
|
-
|
80
|
-
if (!NIL_P(to)) {
|
81
|
-
SockAddrStringValue(to);
|
82
|
-
to = rb_str_new4(to);
|
83
|
-
arg.to = (struct sockaddr *)RSTRING_PTR(to);
|
84
|
-
arg.tolen = RSTRING_SOCKLEN(to);
|
85
|
-
func = rsock_sendto_blocking;
|
86
|
-
funcname = "sendto(2)";
|
87
|
-
}
|
88
|
-
else {
|
89
|
-
func = rsock_send_blocking;
|
90
|
-
funcname = "send(2)";
|
91
|
-
}
|
92
|
-
GetOpenFile(sock, fptr);
|
93
|
-
rb_io_set_nonblock(fptr);
|
94
|
-
arg.fd = fptr->fd;
|
95
|
-
arg.flags = NUM2INT(flags);
|
96
|
-
while ((n = (ssize_t)func(&arg)) < 0) {
|
97
|
-
if (NIL_P(agent))
|
98
|
-
agent = rb_ivar_get(rb_thread_current(), ID_ivar_agent);
|
99
|
-
LibevAgent_wait_io(agent, sock, Qtrue);
|
100
|
-
}
|
101
|
-
return SSIZET2NUM(n);
|
102
|
-
}
|
103
|
-
|
104
|
-
static VALUE BasicSocket_recv(int argc, VALUE *argv, VALUE sock) {
|
105
|
-
VALUE underlying_socket = rb_iv_get(sock, "@io");
|
106
|
-
if (!NIL_P(underlying_socket)) sock = underlying_socket;
|
107
|
-
long len = argc >= 1 ? NUM2LONG(argv[0]) : 8192;
|
108
|
-
if (len < 0) {
|
109
|
-
rb_raise(rb_eArgError, "negative length %ld given", len);
|
110
|
-
}
|
111
|
-
|
112
|
-
rb_io_t *fptr;
|
113
|
-
long n;
|
114
|
-
int shrinkable;
|
115
|
-
VALUE agent = Qnil;
|
116
|
-
|
117
|
-
|
118
|
-
VALUE str = argc >= 3 ? argv[2] : Qnil;
|
119
|
-
|
120
|
-
shrinkable = io_setstrbuf(&str, len);
|
121
|
-
OBJ_TAINT(str);
|
122
|
-
GetOpenFile(sock, fptr);
|
123
|
-
// rb_io_set_nonblock(fptr);
|
124
|
-
rb_io_check_byte_readable(fptr);
|
125
|
-
|
126
|
-
if (len == 0)
|
127
|
-
return str;
|
128
|
-
|
129
|
-
while (1) {
|
130
|
-
n = recv(fptr->fd, RSTRING_PTR(str), len, MSG_DONTWAIT);
|
131
|
-
if (n < 0) {
|
132
|
-
int e = errno;
|
133
|
-
if (e == EWOULDBLOCK || e == EAGAIN) {
|
134
|
-
if (NIL_P(agent))
|
135
|
-
agent = rb_ivar_get(rb_thread_current(), ID_ivar_agent);
|
136
|
-
LibevAgent_wait_io(agent, sock, Qnil);
|
137
|
-
}
|
138
|
-
else
|
139
|
-
rb_syserr_fail(e, strerror(e));
|
140
|
-
// rb_syserr_fail_path(e, fptr->pathv);
|
141
|
-
}
|
142
|
-
else
|
143
|
-
break;
|
144
|
-
}
|
145
|
-
|
146
|
-
io_set_read_length(str, n, shrinkable);
|
147
|
-
io_enc_str(str, fptr);
|
148
|
-
|
149
|
-
if (n == 0)
|
150
|
-
return Qnil;
|
151
|
-
|
152
|
-
return str;
|
153
|
-
}
|
154
|
-
|
155
|
-
static VALUE Socket_accept(VALUE sock) {
|
156
|
-
rb_io_t *fptr;
|
157
|
-
int fd;
|
158
|
-
struct sockaddr addr;
|
159
|
-
socklen_t len = (socklen_t)sizeof addr;
|
160
|
-
VALUE agent = Qnil;
|
161
|
-
|
162
|
-
GetOpenFile(sock, fptr);
|
163
|
-
rb_io_set_nonblock(fptr);
|
164
|
-
|
165
|
-
while (1) {
|
166
|
-
fd = accept(fptr->fd, &addr, &len);
|
167
|
-
|
168
|
-
if (fd < 0) {
|
169
|
-
int e = errno;
|
170
|
-
if (e == EWOULDBLOCK || e == EAGAIN) {
|
171
|
-
if (NIL_P(agent))
|
172
|
-
agent = rb_ivar_get(rb_thread_current(), ID_ivar_agent);
|
173
|
-
LibevAgent_wait_io(agent, sock, Qnil);
|
174
|
-
}
|
175
|
-
else
|
176
|
-
rb_syserr_fail(e, strerror(e));
|
177
|
-
// rb_syserr_fail_path(e, fptr->pathv);
|
178
|
-
}
|
179
|
-
else {
|
180
|
-
VALUE connection = rb_obj_alloc(cTCPSocket);
|
181
|
-
rb_io_t *fp;
|
182
|
-
MakeOpenFile(connection, fp);
|
183
|
-
rb_update_max_fd(fd);
|
184
|
-
fp->fd = fd;
|
185
|
-
fp->mode = FMODE_READWRITE | FMODE_DUPLEX;
|
186
|
-
rb_io_ascii8bit_binmode(connection);
|
187
|
-
rb_io_set_nonblock(fp);
|
188
|
-
rb_io_synchronized(fp);
|
189
|
-
// if (rsock_do_not_reverse_lookup) {
|
190
|
-
// fp->mode |= FMODE_NOREVLOOKUP;
|
191
|
-
// }
|
192
|
-
|
193
|
-
return connection;
|
194
|
-
}
|
195
|
-
}
|
196
|
-
}
|
197
|
-
|
198
|
-
void Init_Socket() {
|
199
|
-
VALUE cBasicSocket;
|
200
|
-
VALUE cSocket;
|
201
|
-
|
202
|
-
rb_require("socket");
|
203
|
-
cBasicSocket = rb_const_get(rb_cObject, rb_intern("BasicSocket"));
|
204
|
-
|
205
|
-
rb_define_method(cBasicSocket, "send", BasicSocket_send, -1);
|
206
|
-
rb_define_method(cBasicSocket, "recv", BasicSocket_recv, -1);
|
207
|
-
|
208
|
-
cSocket = rb_const_get(rb_cObject, rb_intern("Socket"));
|
209
|
-
|
210
|
-
// rb_define_method(cSocket, "accept", Socket_accept, 0);
|
211
|
-
|
212
|
-
cTCPSocket = rb_const_get(rb_cObject, rb_intern("TCPSocket"));
|
213
|
-
}
|