polyphony 0.40 → 0.41

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +11 -2
  3. data/.gitignore +2 -2
  4. data/.rubocop.yml +30 -0
  5. data/CHANGELOG.md +6 -2
  6. data/Gemfile.lock +9 -6
  7. data/Rakefile +2 -2
  8. data/TODO.md +18 -97
  9. data/docs/_includes/head.html +40 -0
  10. data/docs/_includes/nav.html +5 -5
  11. data/docs/api-reference/fiber.md +2 -2
  12. data/docs/main-concepts/design-principles.md +67 -9
  13. data/docs/main-concepts/extending.md +1 -1
  14. data/examples/core/xx-agent.rb +102 -0
  15. data/examples/core/xx-sleeping.rb +14 -6
  16. data/examples/io/xx-irb.rb +1 -1
  17. data/examples/performance/thread-vs-fiber/polyphony_mt_server.rb +7 -6
  18. data/examples/performance/thread-vs-fiber/polyphony_server.rb +14 -25
  19. data/ext/{gyro → polyphony}/extconf.rb +2 -2
  20. data/ext/{gyro → polyphony}/fiber.c +15 -19
  21. data/ext/{gyro → polyphony}/libev.c +0 -0
  22. data/ext/{gyro → polyphony}/libev.h +0 -0
  23. data/ext/polyphony/libev_agent.c +503 -0
  24. data/ext/polyphony/libev_queue.c +214 -0
  25. data/ext/{gyro/gyro.c → polyphony/polyphony.c} +16 -25
  26. data/ext/polyphony/polyphony.h +90 -0
  27. data/ext/polyphony/polyphony_ext.c +23 -0
  28. data/ext/{gyro → polyphony}/socket.c +14 -14
  29. data/ext/{gyro → polyphony}/thread.c +32 -115
  30. data/ext/{gyro → polyphony}/tracing.c +1 -1
  31. data/lib/polyphony.rb +16 -12
  32. data/lib/polyphony/adapters/irb.rb +1 -1
  33. data/lib/polyphony/adapters/postgres.rb +6 -5
  34. data/lib/polyphony/adapters/process.rb +5 -5
  35. data/lib/polyphony/adapters/trace.rb +28 -28
  36. data/lib/polyphony/core/channel.rb +3 -3
  37. data/lib/polyphony/core/exceptions.rb +1 -1
  38. data/lib/polyphony/core/global_api.rb +11 -9
  39. data/lib/polyphony/core/resource_pool.rb +3 -3
  40. data/lib/polyphony/core/sync.rb +2 -2
  41. data/lib/polyphony/core/thread_pool.rb +6 -6
  42. data/lib/polyphony/core/throttler.rb +13 -6
  43. data/lib/polyphony/event.rb +27 -0
  44. data/lib/polyphony/extensions/core.rb +20 -11
  45. data/lib/polyphony/extensions/fiber.rb +4 -4
  46. data/lib/polyphony/extensions/io.rb +56 -26
  47. data/lib/polyphony/extensions/openssl.rb +4 -8
  48. data/lib/polyphony/extensions/socket.rb +27 -9
  49. data/lib/polyphony/extensions/thread.rb +16 -9
  50. data/lib/polyphony/net.rb +9 -9
  51. data/lib/polyphony/version.rb +1 -1
  52. data/polyphony.gemspec +2 -2
  53. data/test/helper.rb +12 -1
  54. data/test/test_agent.rb +77 -0
  55. data/test/{test_async.rb → test_event.rb} +13 -7
  56. data/test/test_ext.rb +25 -4
  57. data/test/test_fiber.rb +19 -10
  58. data/test/test_global_api.rb +4 -4
  59. data/test/test_io.rb +46 -24
  60. data/test/test_queue.rb +74 -0
  61. data/test/test_signal.rb +3 -40
  62. data/test/test_socket.rb +33 -0
  63. data/test/test_thread.rb +37 -16
  64. data/test/test_trace.rb +6 -5
  65. metadata +24 -24
  66. data/ext/gyro/async.c +0 -132
  67. data/ext/gyro/child.c +0 -108
  68. data/ext/gyro/gyro.h +0 -158
  69. data/ext/gyro/gyro_ext.c +0 -33
  70. data/ext/gyro/io.c +0 -457
  71. data/ext/gyro/queue.c +0 -146
  72. data/ext/gyro/selector.c +0 -205
  73. data/ext/gyro/signal.c +0 -99
  74. data/ext/gyro/timer.c +0 -115
  75. data/test/test_timer.rb +0 -56
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'helper'
4
+ require 'polyphony/adapters/trace'
4
5
 
5
6
  class TraceTest < MiniTest::Test
6
7
  def test_tracing_disabled
@@ -11,13 +12,13 @@ class TraceTest < MiniTest::Test
11
12
  assert_equal 0, records.size
12
13
  ensure
13
14
  t&.disable
14
- Gyro.trace(nil)
15
+ Polyphony.trace(nil)
15
16
  end
16
17
 
17
18
  def test_tracing_enabled
18
19
  records = []
19
20
  t = Polyphony::Trace.new(:fiber_all) { |r| records << r if r[:event] =~ /^fiber_/ }
20
- Gyro.trace(true)
21
+ Polyphony.trace(true)
21
22
  t.enable
22
23
  snooze
23
24
  t.disable
@@ -28,14 +29,14 @@ class TraceTest < MiniTest::Test
28
29
  assert_equal [Fiber.current], records.map { |r| r[:fiber] }.uniq
29
30
  ensure
30
31
  t&.disable
31
- Gyro.trace(nil)
32
+ Polyphony.trace(nil)
32
33
  end
33
34
 
34
35
  def test_2_fiber_trace
35
36
  records = []
36
37
  t = Polyphony::Trace.new(:fiber_all) { |r| records << r if r[:event] =~ /^fiber_/ }
37
38
  t.enable
38
- Gyro.trace(true)
39
+ Polyphony.trace(true)
39
40
 
40
41
  f = spin { sleep 0 }
41
42
  suspend
@@ -61,6 +62,6 @@ class TraceTest < MiniTest::Test
61
62
  ], events
62
63
  ensure
63
64
  t&.disable
64
- Gyro.trace(nil)
65
+ Polyphony.trace(nil)
65
66
  end
66
67
  end
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.40'
4
+ version: '0.41'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-04 00:00:00.000000000 Z
11
+ date: 2020-06-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: 0.80.0
89
+ version: 0.85.1
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: 0.80.0
96
+ version: 0.85.1
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: pg
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -224,7 +224,7 @@ description:
224
224
  email: ciconia@gmail.com
225
225
  executables: []
226
226
  extensions:
227
- - ext/gyro/extconf.rb
227
+ - ext/polyphony/extconf.rb
228
228
  extra_rdoc_files:
229
229
  - README.md
230
230
  files:
@@ -242,6 +242,7 @@ files:
242
242
  - TODO.md
243
243
  - bin/polyphony-debug
244
244
  - docs/_config.yml
245
+ - docs/_includes/head.html
245
246
  - docs/_includes/nav.html
246
247
  - docs/_includes/prevnext.html
247
248
  - docs/_layouts/default.html
@@ -297,6 +298,7 @@ files:
297
298
  - examples/core/02-awaiting-fibers.rb
298
299
  - examples/core/03-interrupting.rb
299
300
  - examples/core/forever_sleep.rb
301
+ - examples/core/xx-agent.rb
300
302
  - examples/core/xx-at_exit.rb
301
303
  - examples/core/xx-caller.rb
302
304
  - examples/core/xx-channels.rb
@@ -363,23 +365,6 @@ files:
363
365
  - examples/performance/thread-vs-fiber/xx-httparty_multi.rb
364
366
  - examples/performance/thread-vs-fiber/xx-httparty_threaded.rb
365
367
  - examples/performance/thread_pool_perf.rb
366
- - ext/gyro/async.c
367
- - ext/gyro/child.c
368
- - ext/gyro/extconf.rb
369
- - ext/gyro/fiber.c
370
- - ext/gyro/gyro.c
371
- - ext/gyro/gyro.h
372
- - ext/gyro/gyro_ext.c
373
- - ext/gyro/io.c
374
- - ext/gyro/libev.c
375
- - ext/gyro/libev.h
376
- - ext/gyro/queue.c
377
- - ext/gyro/selector.c
378
- - ext/gyro/signal.c
379
- - ext/gyro/socket.c
380
- - ext/gyro/thread.c
381
- - ext/gyro/timer.c
382
- - ext/gyro/tracing.c
383
368
  - ext/libev/Changes
384
369
  - ext/libev/LICENSE
385
370
  - ext/libev/README
@@ -396,6 +381,18 @@ files:
396
381
  - ext/libev/ev_win32.c
397
382
  - ext/libev/ev_wrap.h
398
383
  - ext/libev/test_libev_win32.c
384
+ - ext/polyphony/extconf.rb
385
+ - ext/polyphony/fiber.c
386
+ - ext/polyphony/libev.c
387
+ - ext/polyphony/libev.h
388
+ - ext/polyphony/libev_agent.c
389
+ - ext/polyphony/libev_queue.c
390
+ - ext/polyphony/polyphony.c
391
+ - ext/polyphony/polyphony.h
392
+ - ext/polyphony/polyphony_ext.c
393
+ - ext/polyphony/socket.c
394
+ - ext/polyphony/thread.c
395
+ - ext/polyphony/tracing.c
399
396
  - lib/polyphony.rb
400
397
  - lib/polyphony/adapters/fs.rb
401
398
  - lib/polyphony/adapters/irb.rb
@@ -410,6 +407,7 @@ files:
410
407
  - lib/polyphony/core/sync.rb
411
408
  - lib/polyphony/core/thread_pool.rb
412
409
  - lib/polyphony/core/throttler.rb
410
+ - lib/polyphony/event.rb
413
411
  - lib/polyphony/extensions/core.rb
414
412
  - lib/polyphony/extensions/fiber.rb
415
413
  - lib/polyphony/extensions/io.rb
@@ -424,20 +422,22 @@ files:
424
422
  - test/helper.rb
425
423
  - test/run.rb
426
424
  - test/stress.rb
427
- - test/test_async.rb
425
+ - test/test_agent.rb
426
+ - test/test_event.rb
428
427
  - test/test_ext.rb
429
428
  - test/test_fiber.rb
430
429
  - test/test_global_api.rb
431
430
  - test/test_io.rb
432
431
  - test/test_kernel.rb
433
432
  - test/test_process_supervision.rb
433
+ - test/test_queue.rb
434
434
  - test/test_resource_pool.rb
435
435
  - test/test_signal.rb
436
+ - test/test_socket.rb
436
437
  - test/test_supervise.rb
437
438
  - test/test_thread.rb
438
439
  - test/test_thread_pool.rb
439
440
  - test/test_throttler.rb
440
- - test/test_timer.rb
441
441
  - test/test_trace.rb
442
442
  homepage: https://digital-fabric.github.io/polyphony
443
443
  licenses:
@@ -1,132 +0,0 @@
1
- #include "gyro.h"
2
-
3
- struct Gyro_Async {
4
- GYRO_WATCHER_DECL(ev_async);
5
- VALUE value;
6
- };
7
-
8
- VALUE cGyro_Async = Qnil;
9
-
10
- static void Gyro_Async_mark(void *ptr) {
11
- struct Gyro_Async *async = ptr;
12
-
13
- GYRO_WATCHER_MARK(async);
14
- if (async->value != Qnil) rb_gc_mark(async->value);
15
- }
16
-
17
- static void Gyro_Async_free(void *ptr) {
18
- struct Gyro_Async *async = ptr;
19
-
20
- GYRO_WATCHER_FREE(async);
21
- }
22
-
23
- static size_t Gyro_Async_size(const void *ptr) {
24
- return sizeof(struct Gyro_Async);
25
- }
26
-
27
- static const rb_data_type_t Gyro_Async_type = {
28
- "Gyro_Async",
29
- {Gyro_Async_mark, Gyro_Async_free, Gyro_Async_size,},
30
- 0, 0, 0
31
- };
32
-
33
- static VALUE Gyro_Async_allocate(VALUE klass) {
34
- struct Gyro_Async *async = ALLOC(struct Gyro_Async);
35
-
36
- return TypedData_Wrap_Struct(klass, &Gyro_Async_type, async);
37
- }
38
-
39
- inline void async_activate(struct Gyro_Async *async) {
40
- if (async->active) return;
41
-
42
- async->active = 1;
43
- async->fiber = rb_fiber_current();
44
- async->selector = Thread_current_event_selector();
45
- async->ev_loop = Gyro_Selector_ev_loop(async->selector);
46
- Gyro_Selector_add_active_watcher(async->selector, async->self);
47
- ev_async_start(async->ev_loop, &async->ev_async);
48
- }
49
-
50
- inline void async_deactivate(struct Gyro_Async *async) {
51
- if (!async->active) return;
52
-
53
- ev_async_stop(async->ev_loop, &async->ev_async);
54
- Gyro_Selector_remove_active_watcher(async->selector, async->self);
55
- async->active = 0;
56
- async->ev_loop = 0;
57
- async->selector = Qnil;
58
- async->fiber = Qnil;
59
- async->value = Qnil;
60
- }
61
-
62
- void Gyro_Async_callback(struct ev_loop *ev_loop, struct ev_async *ev_async, int revents) {
63
- struct Gyro_Async *async = (struct Gyro_Async*)ev_async;
64
-
65
- Fiber_make_runnable(async->fiber, async->value);
66
- async_deactivate(async);
67
- }
68
-
69
- #define GetGyro_Async(obj, async) \
70
- TypedData_Get_Struct((obj), struct Gyro_Async, &Gyro_Async_type, (async))
71
-
72
- static VALUE Gyro_Async_initialize(VALUE self) {
73
- struct Gyro_Async *async;
74
- GetGyro_Async(self, async);
75
-
76
- GYRO_WATCHER_INITIALIZE(async, self);
77
- async->value = Qnil;
78
- ev_async_init(&async->ev_async, Gyro_Async_callback);
79
-
80
- return Qnil;
81
- }
82
-
83
- static VALUE Gyro_Async_signal(int argc, VALUE *argv, VALUE self) {
84
- struct Gyro_Async *async;
85
- GetGyro_Async(self, async);
86
-
87
- if (!async->active) {
88
- // printf("signal called before await\n");
89
- return Qnil;
90
- }
91
-
92
- async->value = (argc == 1) ? argv[0] : Qnil;
93
- ev_async_send(async->ev_loop, &async->ev_async);
94
-
95
- return Qnil;
96
- }
97
-
98
- VALUE Gyro_Async_await(VALUE self) {
99
- struct Gyro_Async *async;
100
- VALUE ret;
101
- GetGyro_Async(self, async);
102
-
103
- async_activate(async);
104
- ret = Gyro_switchpoint();
105
- async_deactivate(async);
106
-
107
- TEST_RESUME_EXCEPTION(ret);
108
- RB_GC_GUARD(ret);
109
- return ret;
110
- }
111
-
112
- VALUE Gyro_Async_await_no_raise(VALUE self) {
113
- struct Gyro_Async *async;
114
- VALUE ret;
115
- GetGyro_Async(self, async);
116
-
117
- async_activate(async);
118
- ret = Gyro_switchpoint();
119
- async_deactivate(async);
120
-
121
- RB_GC_GUARD(ret);
122
- return ret;
123
- }
124
-
125
- void Init_Gyro_Async() {
126
- cGyro_Async = rb_define_class_under(mGyro, "Async", rb_cData);
127
- rb_define_alloc_func(cGyro_Async, Gyro_Async_allocate);
128
-
129
- rb_define_method(cGyro_Async, "initialize", Gyro_Async_initialize, 0);
130
- rb_define_method(cGyro_Async, "await", Gyro_Async_await, 0);
131
- rb_define_method(cGyro_Async, "signal", Gyro_Async_signal, -1);
132
- }
@@ -1,108 +0,0 @@
1
- #include "gyro.h"
2
-
3
- struct Gyro_Child {
4
- GYRO_WATCHER_DECL(ev_child);
5
- int pid;
6
- };
7
-
8
- static VALUE cGyro_Child = Qnil;
9
-
10
- static void Gyro_Child_mark(void *ptr) {
11
- struct Gyro_Child *child = ptr;
12
- GYRO_WATCHER_MARK(child);
13
- }
14
-
15
- static void Gyro_Child_free(void *ptr) {
16
- struct Gyro_Child *child = ptr;
17
- GYRO_WATCHER_FREE(child);
18
- }
19
-
20
- static size_t Gyro_Child_size(const void *ptr) {
21
- return sizeof(struct Gyro_Child);
22
- }
23
-
24
- static const rb_data_type_t Gyro_Child_type = {
25
- "Gyro_Child",
26
- {Gyro_Child_mark, Gyro_Child_free, Gyro_Child_size,},
27
- 0, 0, 0
28
- };
29
-
30
- static VALUE Gyro_Child_allocate(VALUE klass) {
31
- struct Gyro_Child *child = ALLOC(struct Gyro_Child);
32
- return TypedData_Wrap_Struct(klass, &Gyro_Child_type, child);
33
- }
34
-
35
- inline void child_activate(struct Gyro_Child *child) {
36
- if (child->active) return;
37
-
38
- child->active = 1;
39
- child->fiber = rb_fiber_current();
40
- child->selector = Thread_current_event_selector();
41
- child->ev_loop = Gyro_Selector_ev_loop(child->selector);
42
- Gyro_Selector_add_active_watcher(child->selector, child->self);
43
- ev_child_start(child->ev_loop, &child->ev_child);
44
- }
45
-
46
- inline void child_deactivate(struct Gyro_Child *child) {
47
- if (!child->active) return;
48
-
49
- ev_child_stop(child->ev_loop, &child->ev_child);
50
- Gyro_Selector_remove_active_watcher(child->selector, child->self);
51
- child->active = 0;
52
- child->ev_loop = 0;
53
- child->selector = Qnil;
54
- child->fiber = Qnil;
55
- }
56
-
57
- VALUE Gyro_Child_resume_value(struct ev_child *ev_child) {
58
- int exit_status = ev_child->rstatus >> 8; // weird, why should we do this?
59
-
60
- return rb_ary_new_from_args(
61
- 2, INT2NUM(ev_child->rpid), INT2NUM(exit_status)
62
- );
63
- }
64
-
65
- void Gyro_Child_callback(struct ev_loop *ev_loop, struct ev_child *ev_child, int revents) {
66
- struct Gyro_Child *child = (struct Gyro_Child*)ev_child;
67
-
68
- VALUE resume_value = Gyro_Child_resume_value(ev_child);
69
- Fiber_make_runnable(child->fiber, resume_value);
70
-
71
- child_deactivate(child);
72
- }
73
-
74
- #define GetGyro_Child(obj, child) \
75
- TypedData_Get_Struct((obj), struct Gyro_Child, &Gyro_Child_type, (child))
76
-
77
- static VALUE Gyro_Child_initialize(VALUE self, VALUE pid) {
78
- struct Gyro_Child *child;
79
-
80
- GetGyro_Child(self, child);
81
- GYRO_WATCHER_INITIALIZE(child, self);
82
- child->pid = NUM2INT(pid);
83
- ev_child_init(&child->ev_child, Gyro_Child_callback, child->pid, 0);
84
-
85
- return Qnil;
86
- }
87
-
88
- static VALUE Gyro_Child_await(VALUE self) {
89
- struct Gyro_Child *child;
90
- VALUE ret;
91
- GetGyro_Child(self, child);
92
-
93
- child_activate(child);
94
- ret = Gyro_switchpoint();
95
- child_deactivate(child);
96
-
97
- TEST_RESUME_EXCEPTION(ret);
98
- RB_GC_GUARD(ret);
99
- return ret;
100
- }
101
-
102
- void Init_Gyro_Child() {
103
- cGyro_Child = rb_define_class_under(mGyro, "Child", rb_cData);
104
- rb_define_alloc_func(cGyro_Child, Gyro_Child_allocate);
105
-
106
- rb_define_method(cGyro_Child, "initialize", Gyro_Child_initialize, 1);
107
- rb_define_method(cGyro_Child, "await", Gyro_Child_await, 0);
108
- }
@@ -1,158 +0,0 @@
1
- #ifndef RUBY_EV_H
2
- #define RUBY_EV_H
3
-
4
- #include "ruby.h"
5
- #include "ruby/io.h"
6
- #include "libev.h"
7
-
8
- // debugging
9
- #define OBJ_ID(obj) (NUM2LONG(rb_funcall(obj, rb_intern("object_id"), 0)))
10
- #define INSPECT(...) (rb_funcall(rb_cObject, rb_intern("p"), __VA_ARGS__))
11
- #define FIBER_TRACE(...) if (__tracing_enabled__) { \
12
- rb_funcall(rb_cObject, ID_fiber_trace, __VA_ARGS__); \
13
- }
14
-
15
- #define TEST_RESUME_EXCEPTION(ret) if (RTEST(rb_obj_is_kind_of(ret, rb_eException))) { \
16
- return rb_funcall(rb_mKernel, ID_raise, 1, ret); \
17
- }
18
-
19
- typedef struct Gyro_watcher {
20
- int active;
21
- int generation;
22
-
23
- struct ev_loop *ev_loop;
24
-
25
- VALUE self;
26
- VALUE fiber;
27
- VALUE selector;
28
- } Gyro_watcher_t;
29
-
30
-
31
- #define GYRO_WATCHER_DECL(type) \
32
- struct type type; \
33
- int active; \
34
- int generation; \
35
- struct ev_loop *ev_loop; \
36
- VALUE self; \
37
- VALUE fiber; \
38
- VALUE selector;
39
-
40
- #define GYRO_WATCHER_INITIALIZE(o, self) \
41
- o->active = 0; \
42
- o->generation = __gyro_current_generation__; \
43
- o->ev_loop = 0; \
44
- o->self = self; \
45
- o->fiber = Qnil; \
46
- o->selector = Qnil;
47
-
48
- #define GYRO_WATCHER_MARK(o) \
49
- if (o->fiber != Qnil) rb_gc_mark(o->fiber); \
50
- if (o->selector != Qnil) rb_gc_mark(o->selector);
51
-
52
- #define GYRO_WATCHER_STOP_EXPAND(o) ev_ ## o ## _stop
53
- #define GYRO_WATCHER_STOP(o) GYRO_WATCHER_STOP_EXPAND(o)
54
-
55
- #define GYRO_WATCHER_FIELD_EXPAND(o) ev_ ## o
56
- #define GYRO_WATCHER_FIELD(o) GYRO_WATCHER_FIELD_EXPAND(o)
57
-
58
- #define GYRO_WATCHER_FREE(o) \
59
- if (o->generation < __gyro_current_generation__) return; \
60
- if (o->active) { \
61
- ev_clear_pending(o->ev_loop, &o->GYRO_WATCHER_FIELD(o)); \
62
- GYRO_WATCHER_STOP(o)(o->ev_loop, &o->GYRO_WATCHER_FIELD(o)); \
63
- } \
64
- xfree(o);
65
-
66
- extern VALUE mGyro;
67
- extern VALUE cGyro_Async;
68
- extern VALUE cGyro_IO;
69
- extern VALUE cGyro_Queue;
70
- extern VALUE cGyro_Selector;
71
- extern VALUE cGyro_Timer;
72
-
73
- extern ID ID_call;
74
- extern ID ID_caller;
75
- extern ID ID_clear;
76
- extern ID ID_each;
77
- extern ID ID_fiber_trace;
78
- extern ID ID_inspect;
79
- extern ID ID_ivar_running;
80
- extern ID ID_ivar_thread;
81
- extern ID ID_new;
82
- extern ID ID_raise;
83
- extern ID ID_runnable;
84
- extern ID ID_runnable_value;
85
- extern ID ID_signal;
86
- extern ID ID_size;
87
- extern ID ID_switch_fiber;
88
- extern ID ID_transfer;
89
- extern ID ID_R;
90
- extern ID ID_W;
91
- extern ID ID_RW;
92
-
93
- extern VALUE SYM_fiber_create;
94
- extern VALUE SYM_fiber_ev_loop_enter;
95
- extern VALUE SYM_fiber_ev_loop_leave;
96
- extern VALUE SYM_fiber_run;
97
- extern VALUE SYM_fiber_schedule;
98
- extern VALUE SYM_fiber_switchpoint;
99
- extern VALUE SYM_fiber_terminate;
100
-
101
- extern int __tracing_enabled__;
102
- extern int __gyro_current_generation__;
103
-
104
- enum {
105
- FIBER_STATE_NOT_SCHEDULED = 0,
106
- FIBER_STATE_WAITING = 1,
107
- FIBER_STATE_SCHEDULED = 2
108
- };
109
-
110
- // watcher flags
111
- enum {
112
- // a watcher's active field will be set to this after fork
113
- GYRO_WATCHER_POST_FORK = 0xFF
114
- };
115
-
116
- VALUE Fiber_auto_async(VALUE self);
117
- VALUE Fiber_auto_io(VALUE self);
118
- void Fiber_make_runnable(VALUE fiber, VALUE value);
119
-
120
- VALUE Gyro_Async_await(VALUE async);
121
- VALUE Gyro_Async_await_no_raise(VALUE async);
122
-
123
- VALUE Gyro_IO_auto_io(int fd, int events);
124
- VALUE Gyro_IO_await(VALUE self);
125
-
126
- void Gyro_Selector_add_active_watcher(VALUE self, VALUE watcher);
127
- VALUE Gyro_Selector_break_out_of_ev_loop(VALUE self);
128
- struct ev_loop *Gyro_Selector_current_thread_ev_loop();
129
- struct ev_loop *Gyro_Selector_ev_loop(VALUE selector);
130
- ev_tstamp Gyro_Selector_now(VALUE selector);
131
- long Gyro_Selector_pending_count(VALUE self);
132
- VALUE Gyro_Selector_post_fork(VALUE self);
133
- void Gyro_Selector_remove_active_watcher(VALUE self, VALUE watcher);
134
- VALUE Gyro_Selector_run(VALUE self, VALUE current_fiber);
135
- void Gyro_Selector_run_no_wait(VALUE self, VALUE current_fiber, long runnable_count);
136
- VALUE Gyro_switchpoint();
137
-
138
-
139
- VALUE Gyro_snooze(VALUE self);
140
- VALUE Gyro_Timer_await(VALUE self);
141
-
142
- VALUE IO_read_watcher(VALUE io);
143
- VALUE IO_write_watcher(VALUE io);
144
-
145
- VALUE Gyro_Queue_push(VALUE self, VALUE value);
146
-
147
- VALUE Thread_current_event_selector();
148
- VALUE Thread_post_fork(VALUE thread);
149
- VALUE Thread_ref(VALUE thread);
150
- VALUE Thread_schedule_fiber(VALUE thread, VALUE fiber, VALUE value);
151
- VALUE Thread_switch_fiber(VALUE thread);
152
- VALUE Thread_unref(VALUE thread);
153
-
154
- int io_setstrbuf(VALUE *str, long len);
155
- void io_set_read_length(VALUE str, long n, int shrinkable);
156
- VALUE io_enc_str(VALUE str, rb_io_t *fptr);
157
-
158
- #endif /* RUBY_EV_H */