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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -1
  3. data/CHANGELOG.md +29 -0
  4. data/Gemfile.lock +2 -2
  5. data/README.md +0 -1
  6. data/docs/_sass/custom/custom.scss +10 -0
  7. data/docs/favicon.ico +0 -0
  8. data/docs/getting-started/overview.md +2 -2
  9. data/docs/index.md +6 -3
  10. data/docs/main-concepts/design-principles.md +23 -34
  11. data/docs/main-concepts/fiber-scheduling.md +1 -1
  12. data/docs/polyphony-logo.png +0 -0
  13. data/examples/adapters/concurrent-ruby.rb +9 -0
  14. data/examples/adapters/redis_blpop.rb +12 -0
  15. data/examples/core/xx-daemon.rb +14 -0
  16. data/examples/performance/mem-usage.rb +34 -28
  17. data/examples/performance/messaging.rb +29 -0
  18. data/examples/performance/multi_snooze.rb +11 -9
  19. data/ext/polyphony/libev_agent.c +181 -151
  20. data/ext/polyphony/libev_queue.c +129 -57
  21. data/ext/polyphony/polyphony.c +0 -6
  22. data/ext/polyphony/polyphony.h +12 -5
  23. data/ext/polyphony/polyphony_ext.c +0 -2
  24. data/ext/polyphony/ring_buffer.c +120 -0
  25. data/ext/polyphony/ring_buffer.h +28 -0
  26. data/ext/polyphony/thread.c +13 -13
  27. data/lib/polyphony.rb +26 -10
  28. data/lib/polyphony/adapters/redis.rb +3 -2
  29. data/lib/polyphony/core/global_api.rb +5 -3
  30. data/lib/polyphony/core/resource_pool.rb +19 -9
  31. data/lib/polyphony/core/thread_pool.rb +1 -1
  32. data/lib/polyphony/extensions/core.rb +40 -0
  33. data/lib/polyphony/extensions/fiber.rb +8 -13
  34. data/lib/polyphony/extensions/io.rb +17 -16
  35. data/lib/polyphony/extensions/socket.rb +12 -2
  36. data/lib/polyphony/version.rb +1 -1
  37. data/test/q.rb +24 -0
  38. data/test/test_agent.rb +13 -7
  39. data/test/test_fiber.rb +3 -3
  40. data/test/test_global_api.rb +50 -17
  41. data/test/test_io.rb +10 -2
  42. data/test/test_queue.rb +26 -1
  43. data/test/test_resource_pool.rb +12 -0
  44. data/test/test_throttler.rb +6 -5
  45. metadata +11 -3
  46. data/ext/polyphony/socket.c +0 -213
@@ -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
- }