polyphony 0.45.5 → 0.47.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +2 -0
  3. data/.gitmodules +0 -0
  4. data/CHANGELOG.md +23 -0
  5. data/Gemfile.lock +1 -1
  6. data/README.md +3 -3
  7. data/Rakefile +1 -1
  8. data/TODO.md +21 -22
  9. data/bin/test +4 -0
  10. data/examples/core/enumerable.rb +64 -0
  11. data/examples/performance/fiber_resume.rb +43 -0
  12. data/examples/performance/fiber_transfer.rb +13 -4
  13. data/examples/performance/thread-vs-fiber/compare.rb +59 -0
  14. data/examples/performance/thread-vs-fiber/em_server.rb +33 -0
  15. data/examples/performance/thread-vs-fiber/polyphony_server.rb +10 -21
  16. data/examples/performance/thread-vs-fiber/threaded_server.rb +22 -15
  17. data/examples/performance/thread_switch.rb +44 -0
  18. data/ext/liburing/liburing.h +585 -0
  19. data/ext/liburing/liburing/README.md +4 -0
  20. data/ext/liburing/liburing/barrier.h +73 -0
  21. data/ext/liburing/liburing/compat.h +15 -0
  22. data/ext/liburing/liburing/io_uring.h +343 -0
  23. data/ext/liburing/queue.c +333 -0
  24. data/ext/liburing/register.c +187 -0
  25. data/ext/liburing/setup.c +210 -0
  26. data/ext/liburing/syscall.c +54 -0
  27. data/ext/liburing/syscall.h +18 -0
  28. data/ext/polyphony/backend.h +0 -14
  29. data/ext/polyphony/backend_common.h +129 -0
  30. data/ext/polyphony/backend_io_uring.c +995 -0
  31. data/ext/polyphony/backend_io_uring_context.c +74 -0
  32. data/ext/polyphony/backend_io_uring_context.h +53 -0
  33. data/ext/polyphony/{libev_backend.c → backend_libev.c} +304 -294
  34. data/ext/polyphony/event.c +1 -1
  35. data/ext/polyphony/extconf.rb +31 -13
  36. data/ext/polyphony/fiber.c +35 -24
  37. data/ext/polyphony/libev.c +4 -0
  38. data/ext/polyphony/libev.h +8 -2
  39. data/ext/polyphony/liburing.c +8 -0
  40. data/ext/polyphony/playground.c +51 -0
  41. data/ext/polyphony/polyphony.c +8 -5
  42. data/ext/polyphony/polyphony.h +23 -19
  43. data/ext/polyphony/polyphony_ext.c +10 -4
  44. data/ext/polyphony/queue.c +100 -35
  45. data/ext/polyphony/thread.c +10 -10
  46. data/lib/polyphony/adapters/trace.rb +2 -2
  47. data/lib/polyphony/core/exceptions.rb +0 -4
  48. data/lib/polyphony/core/global_api.rb +45 -21
  49. data/lib/polyphony/core/resource_pool.rb +12 -1
  50. data/lib/polyphony/extensions/core.rb +9 -15
  51. data/lib/polyphony/extensions/debug.rb +13 -0
  52. data/lib/polyphony/extensions/fiber.rb +8 -4
  53. data/lib/polyphony/extensions/openssl.rb +6 -0
  54. data/lib/polyphony/extensions/socket.rb +73 -10
  55. data/lib/polyphony/version.rb +1 -1
  56. data/test/helper.rb +36 -4
  57. data/test/io_uring_test.rb +55 -0
  58. data/test/stress.rb +4 -1
  59. data/test/test_backend.rb +63 -6
  60. data/test/test_ext.rb +1 -2
  61. data/test/test_fiber.rb +55 -20
  62. data/test/test_global_api.rb +107 -35
  63. data/test/test_queue.rb +117 -0
  64. data/test/test_resource_pool.rb +21 -0
  65. data/test/test_socket.rb +2 -2
  66. data/test/test_throttler.rb +3 -6
  67. data/test/test_trace.rb +7 -5
  68. metadata +28 -3
@@ -69,7 +69,7 @@ VALUE Event_await(VALUE self) {
69
69
  VALUE switchpoint_result = __BACKEND__.wait_event(backend, Qnil);
70
70
  event->waiting_fiber = Qnil;
71
71
 
72
- TEST_RESUME_EXCEPTION(switchpoint_result);
72
+ RAISE_IF_EXCEPTION(switchpoint_result);
73
73
  RB_GC_GUARD(backend);
74
74
  RB_GC_GUARD(switchpoint_result);
75
75
 
@@ -1,20 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rubygems"
3
+ require 'rubygems'
4
+ require 'mkmf'
4
5
 
5
- require "mkmf"
6
+ use_liburing = false
7
+ force_use_libev = ENV['POLYPHONY_USE_LIBEV'] != nil
6
8
 
7
- have_header("unistd.h")
9
+ if !force_use_libev && RUBY_PLATFORM =~ /linux/ && `uname -sr` =~ /Linux 5\.([\d+])/
10
+ kernel_minor_version = $1.gsub('.', '').to_i
11
+ use_liburing = kernel_minor_version >= 6
12
+ end
8
13
 
9
- $defs << "-DEV_USE_LINUXAIO" if have_header("linux/aio_abi.h")
10
- $defs << "-DEV_USE_SELECT" if have_header("sys/select.h")
11
- $defs << "-DEV_USE_POLL" if have_type("port_event_t", "poll.h")
12
- $defs << "-DEV_USE_EPOLL" if have_header("sys/epoll.h")
13
- $defs << "-DEV_USE_KQUEUE" if have_header("sys/event.h") && have_header("sys/queue.h")
14
- $defs << "-DEV_USE_PORT" if have_type("port_event_t", "port.h")
15
- $defs << "-DHAVE_SYS_RESOURCE_H" if have_header("sys/resource.h")
14
+ if use_liburing
15
+ $defs << "-DPOLYPHONY_BACKEND_LIBURING"
16
+ $CFLAGS << " -Wno-pointer-arith"
17
+ else
18
+ $defs << "-DPOLYPHONY_BACKEND_LIBEV"
19
+ $defs << '-DEV_USE_LINUXAIO' if have_header('linux/aio_abi.h')
20
+ $defs << '-DEV_USE_SELECT' if have_header('sys/select.h')
21
+ $defs << '-DEV_USE_POLL' if have_type('port_event_t', 'poll.h')
22
+ $defs << '-DEV_USE_EPOLL' if have_header('sys/epoll.h')
23
+ $defs << '-DEV_USE_KQUEUE' if have_header('sys/event.h') && have_header('sys/queue.h')
24
+ $defs << '-DEV_USE_PORT' if have_type('port_event_t', 'port.h')
25
+ $defs << '-DHAVE_SYS_RESOURCE_H' if have_header('sys/resource.h')
26
+ $CFLAGS << " -Wno-comment"
27
+ $CFLAGS << " -Wno-unused-result"
28
+ $CFLAGS << " -Wno-dangling-else"
29
+ $CFLAGS << " -Wno-parentheses"
30
+ end
16
31
 
17
- CONFIG["optflags"] << " -fno-strict-aliasing" unless RUBY_PLATFORM =~ /mswin/
32
+ $defs << '-DPOLYPHONY_PLAYGROUND' if ENV['POLYPHONY_PLAYGROUND']
18
33
 
19
- dir_config "polyphony_ext"
20
- create_makefile "polyphony_ext"
34
+ CONFIG['optflags'] << ' -fno-strict-aliasing' unless RUBY_PLATFORM =~ /mswin/
35
+
36
+
37
+ dir_config 'polyphony_ext'
38
+ create_makefile 'polyphony_ext'
@@ -3,6 +3,7 @@
3
3
  ID ID_fiber_trace;
4
4
  ID ID_ivar_auto_watcher;
5
5
  ID ID_ivar_mailbox;
6
+ ID ID_ivar_result;
6
7
  ID ID_ivar_waiting_fibers;
7
8
 
8
9
  VALUE SYM_dead;
@@ -11,8 +12,8 @@ VALUE SYM_runnable;
11
12
  VALUE SYM_waiting;
12
13
 
13
14
  VALUE SYM_fiber_create;
14
- VALUE SYM_fiber_ev_loop_enter;
15
- VALUE SYM_fiber_ev_loop_leave;
15
+ VALUE SYM_fiber_event_poll_enter;
16
+ VALUE SYM_fiber_event_poll_leave;
16
17
  VALUE SYM_fiber_run;
17
18
  VALUE SYM_fiber_schedule;
18
19
  VALUE SYM_fiber_switchpoint;
@@ -20,9 +21,9 @@ VALUE SYM_fiber_terminate;
20
21
 
21
22
  static VALUE Fiber_safe_transfer(int argc, VALUE *argv, VALUE self) {
22
23
  VALUE arg = (argc == 0) ? Qnil : argv[0];
23
- VALUE ret = rb_funcall(self, ID_transfer, 1, arg);
24
+ VALUE ret = FIBER_TRANSFER(self, arg);
24
25
 
25
- TEST_RESUME_EXCEPTION(ret);
26
+ RAISE_IF_EXCEPTION(ret);
26
27
  RB_GC_GUARD(ret);
27
28
  return ret;
28
29
  }
@@ -41,8 +42,8 @@ inline VALUE Fiber_auto_watcher(VALUE self) {
41
42
  void Fiber_make_runnable(VALUE fiber, VALUE value) {
42
43
  VALUE thread = rb_ivar_get(fiber, ID_ivar_thread);
43
44
  if (thread == Qnil) {
44
- // rb_raise(rb_eRuntimeError, "No thread set for fiber");
45
- rb_warn("No thread set for fiber");
45
+ rb_raise(rb_eRuntimeError, "No thread set for fiber");
46
+ // rb_warn("No thread set for fiber");
46
47
  return;
47
48
  }
48
49
 
@@ -52,8 +53,8 @@ void Fiber_make_runnable(VALUE fiber, VALUE value) {
52
53
  void Fiber_make_runnable_with_priority(VALUE fiber, VALUE value) {
53
54
  VALUE thread = rb_ivar_get(fiber, ID_ivar_thread);
54
55
  if (thread == Qnil) {
55
- // rb_raise(rb_eRuntimeError, "No thread set for fiber");
56
- rb_warn("No thread set for fiber");
56
+ rb_raise(rb_eRuntimeError, "No thread set for fiber");
57
+ // rb_warn("No thread set for fiber");
57
58
  return;
58
59
  }
59
60
 
@@ -88,7 +89,7 @@ VALUE Fiber_await(VALUE self) {
88
89
  // @running set to nil
89
90
  if (rb_ivar_get(self, ID_ivar_running) == Qfalse) {
90
91
  result = rb_ivar_get(self, ID_ivar_result);
91
- TEST_RESUME_EXCEPTION(result);
92
+ RAISE_IF_EXCEPTION(result);
92
93
  return result;
93
94
  }
94
95
 
@@ -103,7 +104,7 @@ VALUE Fiber_await(VALUE self) {
103
104
  result = Thread_switch_fiber(rb_thread_current());
104
105
 
105
106
  rb_hash_delete(waiting_fibers, fiber);
106
- TEST_RESUME_EXCEPTION(result);
107
+ RAISE_IF_EXCEPTION(result);
107
108
  RB_GC_GUARD(result);
108
109
  return result;
109
110
  }
@@ -127,6 +128,15 @@ VALUE Fiber_receive(VALUE self) {
127
128
  return Queue_shift(mailbox);
128
129
  }
129
130
 
131
+ VALUE Fiber_mailbox(VALUE self) {
132
+ VALUE mailbox = rb_ivar_get(self, ID_ivar_mailbox);
133
+ if (mailbox == Qnil) {
134
+ mailbox = rb_funcall(cQueue, ID_new, 0);
135
+ rb_ivar_set(self, ID_ivar_mailbox, mailbox);
136
+ }
137
+ return mailbox;
138
+ }
139
+
130
140
  VALUE Fiber_receive_all_pending(VALUE self) {
131
141
  VALUE mailbox = rb_ivar_get(self, ID_ivar_mailbox);
132
142
  return (mailbox == Qnil) ? rb_ary_new() : Queue_shift_all(mailbox);
@@ -145,9 +155,9 @@ void Init_Fiber() {
145
155
 
146
156
  rb_define_method(cFiber, "<<", Fiber_send, 1);
147
157
  rb_define_method(cFiber, "send", Fiber_send, 1);
148
-
149
158
  rb_define_method(cFiber, "receive", Fiber_receive, 0);
150
159
  rb_define_method(cFiber, "receive_all_pending", Fiber_receive_all_pending, 0);
160
+ rb_define_method(cFiber, "mailbox", Fiber_mailbox, 0);
151
161
 
152
162
  SYM_dead = ID2SYM(rb_intern("dead"));
153
163
  SYM_running = ID2SYM(rb_intern("running"));
@@ -158,22 +168,23 @@ void Init_Fiber() {
158
168
  rb_global_variable(&SYM_runnable);
159
169
  rb_global_variable(&SYM_waiting);
160
170
 
161
- ID_fiber_trace = rb_intern("__fiber_trace__");
162
- ID_ivar_auto_watcher = rb_intern("@auto_watcher");
163
- ID_ivar_mailbox = rb_intern("@mailbox");
164
- ID_ivar_waiting_fibers = rb_intern("@waiting_fibers");
171
+ ID_fiber_trace = rb_intern("__fiber_trace__");
172
+ ID_ivar_auto_watcher = rb_intern("@auto_watcher");
173
+ ID_ivar_mailbox = rb_intern("@mailbox");
174
+ ID_ivar_result = rb_intern("@result");
175
+ ID_ivar_waiting_fibers = rb_intern("@waiting_fibers");
165
176
 
166
- SYM_fiber_create = ID2SYM(rb_intern("fiber_create"));
167
- SYM_fiber_ev_loop_enter = ID2SYM(rb_intern("fiber_ev_loop_enter"));
168
- SYM_fiber_ev_loop_leave = ID2SYM(rb_intern("fiber_ev_loop_leave"));
169
- SYM_fiber_run = ID2SYM(rb_intern("fiber_run"));
170
- SYM_fiber_schedule = ID2SYM(rb_intern("fiber_schedule"));
171
- SYM_fiber_switchpoint = ID2SYM(rb_intern("fiber_switchpoint"));
172
- SYM_fiber_terminate = ID2SYM(rb_intern("fiber_terminate"));
177
+ SYM_fiber_create = ID2SYM(rb_intern("fiber_create"));
178
+ SYM_fiber_event_poll_enter = ID2SYM(rb_intern("fiber_event_poll_enter"));
179
+ SYM_fiber_event_poll_leave = ID2SYM(rb_intern("fiber_event_poll_leave"));
180
+ SYM_fiber_run = ID2SYM(rb_intern("fiber_run"));
181
+ SYM_fiber_schedule = ID2SYM(rb_intern("fiber_schedule"));
182
+ SYM_fiber_switchpoint = ID2SYM(rb_intern("fiber_switchpoint"));
183
+ SYM_fiber_terminate = ID2SYM(rb_intern("fiber_terminate"));
173
184
 
174
185
  rb_global_variable(&SYM_fiber_create);
175
- rb_global_variable(&SYM_fiber_ev_loop_enter);
176
- rb_global_variable(&SYM_fiber_ev_loop_leave);
186
+ rb_global_variable(&SYM_fiber_event_poll_enter);
187
+ rb_global_variable(&SYM_fiber_event_poll_leave);
177
188
  rb_global_variable(&SYM_fiber_run);
178
189
  rb_global_variable(&SYM_fiber_schedule);
179
190
  rb_global_variable(&SYM_fiber_switchpoint);
@@ -1,2 +1,6 @@
1
+ #ifdef POLYPHONY_BACKEND_LIBEV
2
+
1
3
  #include "libev.h"
2
4
  #include "../libev/ev.c"
5
+
6
+ #endif // POLYPHONY_BACKEND_LIBEV
@@ -1,4 +1,8 @@
1
- #define EV_STANDALONE /* keeps ev from requiring config.h */
1
+ #define EV_STANDALONE
2
+
3
+ #ifdef POLYPHONY_BACKEND_LIBEV
4
+
5
+ /* keeps ev from requiring config.h */
2
6
 
3
7
  #ifdef _WIN32
4
8
  #define EV_SELECT_IS_WINSOCKET 1
@@ -6,4 +10,6 @@
6
10
  #define EV_USE_REALTIME 0
7
11
  #endif
8
12
 
9
- #include "../libev/ev.h"
13
+ #include "../libev/ev.h"
14
+
15
+ #endif // POLYPHONY_BACKEND_LIBEV
@@ -0,0 +1,8 @@
1
+ #ifdef POLYPHONY_BACKEND_LIBURING
2
+
3
+ #include "../liburing/queue.c"
4
+ #include "../liburing/register.c"
5
+ #include "../liburing/setup.c"
6
+ #include "../liburing/syscall.c"
7
+
8
+ #endif // POLYPHONY_BACKEND_LIBURING
@@ -0,0 +1,51 @@
1
+ #ifdef POLYPHONY_PLAYGROUND
2
+
3
+ #include <netdb.h>
4
+ #include <sys/socket.h>
5
+ #include <sys/uio.h>
6
+ #include <unistd.h>
7
+ #include <fcntl.h>
8
+ #include <netinet/in.h>
9
+ #include <arpa/inet.h>
10
+
11
+ #include "polyphony.h"
12
+ #include "../liburing/liburing.h"
13
+ #include "ruby/thread.h"
14
+
15
+ #include <poll.h>
16
+ #include <sys/types.h>
17
+ #include <sys/eventfd.h>
18
+ #include <sys/wait.h>
19
+ #include <time.h>
20
+ #include <stdnoreturn.h>
21
+
22
+ void print(struct io_uring *ring, const char *str) {
23
+ struct io_uring_sqe *sqe = io_uring_get_sqe(ring);
24
+ io_uring_prep_write(sqe, 1, str, strlen(str), -1);
25
+ io_uring_sqe_set_data(sqe, (void *)42);
26
+ // io_uring_sqe_set_flags(sqe, IOSQE_ASYNC);
27
+ io_uring_submit(ring);
28
+
29
+ struct io_uring_cqe *cqe;
30
+ int ret = __io_uring_get_cqe(ring, &cqe, 0, 1, NULL);
31
+ if (ret != 0) {
32
+ printf("ret: %d\n", ret);
33
+ exit(1);
34
+ }
35
+ printf(" cqe res: %d\n", cqe->res);
36
+ io_uring_cqe_seen(ring, cqe);
37
+ }
38
+
39
+ noreturn void playground() {
40
+ struct io_uring ring;
41
+ io_uring_queue_init(1024, &ring, 0);
42
+
43
+ for (int i = 0; i < 10; i++) {
44
+ print(&ring, "hi\n");
45
+ }
46
+
47
+ io_uring_queue_exit(&ring);
48
+ exit(0);
49
+ }
50
+
51
+ #endif //POLYPHONY_PLAYGROUND
@@ -1,6 +1,7 @@
1
1
  #include "polyphony.h"
2
2
 
3
3
  VALUE mPolyphony;
4
+ VALUE cTimeoutException;
4
5
 
5
6
  ID ID_call;
6
7
  ID ID_caller;
@@ -9,7 +10,7 @@ ID ID_each;
9
10
  ID ID_inspect;
10
11
  ID ID_invoke;
11
12
  ID ID_new;
12
- ID ID_ivar_result;
13
+ ID ID_ivar_io;
13
14
  ID ID_ivar_runnable;
14
15
  ID ID_ivar_running;
15
16
  ID ID_ivar_thread;
@@ -29,7 +30,7 @@ VALUE Polyphony_snooze(VALUE self) {
29
30
 
30
31
  Fiber_make_runnable(fiber, Qnil);
31
32
  ret = Thread_switch_fiber(rb_thread_current());
32
- TEST_RESUME_EXCEPTION(ret);
33
+ RAISE_IF_EXCEPTION(ret);
33
34
  RB_GC_GUARD(ret);
34
35
  return ret;
35
36
  }
@@ -37,7 +38,7 @@ VALUE Polyphony_snooze(VALUE self) {
37
38
  static VALUE Polyphony_suspend(VALUE self) {
38
39
  VALUE ret = Thread_switch_fiber(rb_thread_current());
39
40
 
40
- TEST_RESUME_EXCEPTION(ret);
41
+ RAISE_IF_EXCEPTION(ret);
41
42
  RB_GC_GUARD(ret);
42
43
  return ret;
43
44
  }
@@ -55,14 +56,16 @@ void Init_Polyphony() {
55
56
  rb_define_global_function("snooze", Polyphony_snooze, 0);
56
57
  rb_define_global_function("suspend", Polyphony_suspend, 0);
57
58
 
59
+ cTimeoutException = rb_define_class_under(mPolyphony, "TimeoutException", rb_eException);
60
+
58
61
  ID_call = rb_intern("call");
59
62
  ID_caller = rb_intern("caller");
60
63
  ID_clear = rb_intern("clear");
61
64
  ID_each = rb_intern("each");
62
65
  ID_inspect = rb_intern("inspect");
63
66
  ID_invoke = rb_intern("invoke");
64
- ID_ivar_result = rb_intern("@result");
65
- ID_ivar_runnable = rb_intern("runnable");
67
+ ID_ivar_io = rb_intern("@io");
68
+ ID_ivar_runnable = rb_intern("@runnable");
66
69
  ID_ivar_running = rb_intern("@running");
67
70
  ID_ivar_thread = rb_intern("@thread");
68
71
  ID_new = rb_intern("new");
@@ -1,29 +1,36 @@
1
1
  #ifndef POLYPHONY_H
2
2
  #define POLYPHONY_H
3
3
 
4
+ #include <execinfo.h>
5
+
4
6
  #include "ruby.h"
5
- #include "ruby/io.h"
6
- #include "libev.h"
7
7
  #include "backend.h"
8
8
  #include "runqueue_ring_buffer.h"
9
9
 
10
10
  // debugging
11
11
  #define OBJ_ID(obj) (NUM2LONG(rb_funcall(obj, rb_intern("object_id"), 0)))
12
- #define INSPECT(str, obj) { printf(str); VALUE s = rb_funcall(obj, rb_intern("inspect"), 0); printf("%s\n", StringValueCStr(s)); }
12
+ #define INSPECT(str, obj) { printf(str); VALUE s = rb_funcall(obj, rb_intern("inspect"), 0); printf(": %s\n", StringValueCStr(s)); }
13
13
  #define TRACE_CALLER() { VALUE c = rb_funcall(rb_mKernel, rb_intern("caller"), 0); INSPECT("caller: ", c); }
14
+ #define TRACE_C_STACK() { \
15
+ void *entries[10]; \
16
+ size_t size = backtrace(entries, 10); \
17
+ char **strings = backtrace_symbols(entries, size); \
18
+ for (unsigned long i = 0; i < size; i++) printf("%s\n", strings[i]); \
19
+ free(strings); \
20
+ }
14
21
 
15
22
  // tracing
16
23
  #define TRACE(...) rb_funcall(rb_cObject, ID_fiber_trace, __VA_ARGS__)
17
- #define COND_TRACE(...) if (__tracing_enabled__) { \
18
- TRACE(__VA_ARGS__); \
19
- }
24
+ #define COND_TRACE(...) if (__tracing_enabled__) { TRACE(__VA_ARGS__); }
20
25
 
26
+ // exceptions
21
27
  #define TEST_EXCEPTION(ret) (RTEST(rb_obj_is_kind_of(ret, rb_eException)))
22
-
23
28
  #define RAISE_EXCEPTION(e) rb_funcall(e, ID_invoke, 0);
24
- #define TEST_RESUME_EXCEPTION(ret) if (RTEST(rb_obj_is_kind_of(ret, rb_eException))) { \
25
- return RAISE_EXCEPTION(ret); \
26
- }
29
+ #define RAISE_IF_EXCEPTION(ret) if (RTEST(rb_obj_is_kind_of(ret, rb_eException))) { RAISE_EXCEPTION(ret); }
30
+ #define RAISE_IF_NOT_NIL(ret) if (ret != Qnil) { RAISE_EXCEPTION(ret); }
31
+
32
+ // Fiber#transfer
33
+ #define FIBER_TRANSFER(fiber, value) rb_funcall(fiber, ID_transfer, 1, value)
27
34
 
28
35
  extern backend_interface_t backend_interface;
29
36
  #define __BACKEND__ (backend_interface)
@@ -32,6 +39,7 @@ extern VALUE mPolyphony;
32
39
  extern VALUE cQueue;
33
40
  extern VALUE cEvent;
34
41
  extern VALUE cRunqueue;
42
+ extern VALUE cTimeoutException;
35
43
 
36
44
  extern ID ID_call;
37
45
  extern ID ID_caller;
@@ -41,7 +49,7 @@ extern ID ID_fiber_trace;
41
49
  extern ID ID_inspect;
42
50
  extern ID ID_invoke;
43
51
  extern ID ID_ivar_backend;
44
- extern ID ID_ivar_result;
52
+ extern ID ID_ivar_io;
45
53
  extern ID ID_ivar_runnable;
46
54
  extern ID ID_ivar_running;
47
55
  extern ID ID_ivar_thread;
@@ -53,8 +61,8 @@ extern ID ID_switch_fiber;
53
61
  extern ID ID_transfer;
54
62
 
55
63
  extern VALUE SYM_fiber_create;
56
- extern VALUE SYM_fiber_ev_loop_enter;
57
- extern VALUE SYM_fiber_ev_loop_leave;
64
+ extern VALUE SYM_fiber_event_poll_enter;
65
+ extern VALUE SYM_fiber_event_poll_leave;
58
66
  extern VALUE SYM_fiber_run;
59
67
  extern VALUE SYM_fiber_schedule;
60
68
  extern VALUE SYM_fiber_switchpoint;
@@ -75,12 +83,6 @@ VALUE Queue_push(VALUE self, VALUE value);
75
83
  VALUE Queue_unshift(VALUE self, VALUE value);
76
84
  VALUE Queue_shift(VALUE self);
77
85
  VALUE Queue_shift_all(VALUE self);
78
- VALUE Queue_shift_no_wait(VALUE self);
79
- VALUE Queue_clear(VALUE self);
80
- VALUE Queue_delete(VALUE self, VALUE value);
81
- long Queue_len(VALUE self);
82
- void Queue_trace(VALUE self);
83
-
84
86
 
85
87
  void Runqueue_push(VALUE self, VALUE fiber, VALUE value, int reschedule);
86
88
  void Runqueue_unshift(VALUE self, VALUE fiber, VALUE value, int reschedule);
@@ -94,4 +96,6 @@ VALUE Thread_schedule_fiber(VALUE thread, VALUE fiber, VALUE value);
94
96
  VALUE Thread_schedule_fiber_with_priority(VALUE thread, VALUE fiber, VALUE value);
95
97
  VALUE Thread_switch_fiber(VALUE thread);
96
98
 
99
+ VALUE Polyphony_snooze(VALUE self);
100
+
97
101
  #endif /* POLYPHONY_H */
@@ -2,23 +2,29 @@
2
2
 
3
3
  void Init_Fiber();
4
4
  void Init_Polyphony();
5
- void Init_LibevBackend();
5
+ void Init_Backend();
6
6
  void Init_Queue();
7
7
  void Init_Event();
8
8
  void Init_Runqueue();
9
9
  void Init_Thread();
10
10
  void Init_Tracing();
11
11
 
12
- void Init_polyphony_ext() {
13
- ev_set_allocator(xrealloc);
12
+ #ifdef POLYPHONY_PLAYGROUND
13
+ extern void playground();
14
+ #endif
14
15
 
16
+ void Init_polyphony_ext() {
15
17
  Init_Polyphony();
16
18
 
17
- Init_LibevBackend();
19
+ Init_Backend();
18
20
  Init_Queue();
19
21
  Init_Event();
20
22
  Init_Runqueue();
21
23
  Init_Fiber();
22
24
  Init_Thread();
23
25
  Init_Tracing();
26
+
27
+ #ifdef POLYPHONY_PLAYGROUND
28
+ playground();
29
+ #endif
24
30
  }