polyphony 0.39 → 0.40

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3be3a6ec277c0c06e1d4b071f7fcee1229bbdde20d6b78b5b585ca9ac5624cd
4
- data.tar.gz: 27f3e920372dc8ab8e40f07b72444ba08813533e2912c8400fe28ad50ed756c2
3
+ metadata.gz: 2fac2ba159f62bc767c1c022a9ac84e0d682e9dc1cbb10f53e92ba53da376745
4
+ data.tar.gz: 8d43be97359735d5b7ac6b9867716c06c420385bb41f14916edd0a2d2bbca454
5
5
  SHA512:
6
- metadata.gz: 6d4267e177eda276b2d643e0262d1475c9f9f0ebaed2dd8573c245127b618dab11b00c05e0ef58ba2f5b8fd88b127feb1cc0f94390e27c66ae8857d0a5eb1a65
7
- data.tar.gz: 1006b8aa742a9c38bd39512c7f9bfbe3c33b0f07ee1b2e262d8f5f140114066599b9444726c3e9c8cb998326a779da8d14d159ebcf5df226f02eedaa78530f98
6
+ metadata.gz: 0350c4dbee7ad72ba68dfff4fc431870481f43a763d9e265e05ade0ce9545456adef2a79c5efd98ce7fc28b2314ab5558a9e69f9e9ef92759e5ae320c78435be
7
+ data.tar.gz: 7c7774de233962a1b06bac02623a6127f9b716e36852bc6e5849227db80fc0e910549756c83441f6d40dd75a22c26253fcfeef7e50d62482c1cc7603f6c4b2f3
data/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
- ## 0.39 2020-04-13
1
+ ## 0.40 2020-05-04
2
2
 
3
- * Prevent timer scheduling a nil fiber
3
+ * More improvements to stability after fork
4
4
 
5
5
  ## 0.38 2020-04-13
6
6
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- polyphony (0.39)
4
+ polyphony (0.40)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -78,7 +78,7 @@ GEM
78
78
  ast (~> 2.4.0)
79
79
  pathutil (0.16.2)
80
80
  forwardable-extended (~> 2.6)
81
- pg (1.1.3)
81
+ pg (1.1.4)
82
82
  public_suffix (4.0.3)
83
83
  rainbow (3.0.0)
84
84
  rake (12.3.3)
@@ -127,7 +127,7 @@ DEPENDENCIES
127
127
  localhost (= 1.1.4)
128
128
  minitest (= 5.13.0)
129
129
  minitest-reporters (= 1.4.2)
130
- pg (= 1.1.3)
130
+ pg (= 1.1.4)
131
131
  polyphony!
132
132
  rake-compiler (= 1.0.5)
133
133
  redis (= 4.1.0)
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # Polyphony - Fine-Grained Concurrency for Ruby
2
2
 
3
+
3
4
  [![Gem Version](https://badge.fury.io/rb/polyphony.svg)](http://rubygems.org/gems/polyphony)
4
5
  [![Modulation Test](https://github.com/digital-fabric/polyphony/workflows/Tests/badge.svg)](https://github.com/digital-fabric/polyphony/actions?query=workflow%3ATests)
5
6
  [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/digital-fabric/polyphony/blob/master/LICENSE)
@@ -46,4 +47,4 @@ The complete documentation for Polyphony could be found on the
46
47
 
47
48
  Issues and pull requests will be gladly accepted. Please use the [Polyphony git
48
49
  repository](https://github.com/digital-fabric/polyphony) as your primary point
49
- of departure for contributing.
50
+ of departure for contributing.
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+ require 'polyphony'
5
+
6
+ Ports = ARGV[0..1]
7
+ EndPoints = []
8
+
9
+ def log(msg)
10
+ puts "#{Time.now.strftime('%Y-%m-%d %H:%M:%S.%3N')} #{msg}"
11
+ end
12
+
13
+ def endpoint_loop(idx, peer_idx)
14
+ port = Ports[idx]
15
+ server = Polyphony::Net.tcp_listen(
16
+ '0.0.0.0',
17
+ port,
18
+ reuse_addr: true
19
+ )
20
+ # server = TCPServer.open('0.0.0.0', port)
21
+ log "Listening on port #{port}"
22
+ loop do
23
+ conn = server.accept
24
+ conn.binmode
25
+ EndPoints[idx] = conn
26
+ log "Client connected on port #{port} (#{conn.remote_address.inspect})"
27
+ while data = conn.readpartial(8192)
28
+ peer = EndPoints[peer_idx]
29
+ if peer
30
+ peer << data
31
+ log "#{idx} => #{peer_idx} #{data.inspect}"
32
+ else
33
+ log "#{idx}: #{data.inspect}"
34
+ end
35
+ end
36
+ EndPoints[idx] = nil
37
+ log "Connection closed on port #{port}"
38
+ rescue => e
39
+ log "Error on port #{port}: #{e.inspect}"
40
+ end
41
+ end
42
+
43
+ spin { endpoint_loop(0, 1) }
44
+ spin { endpoint_loop(1, 0) }
45
+
46
+ log "Tunneling port #{Ports[0]} to port #{Ports[1]}..."
47
+ sleep
48
+
data/ext/gyro/async.c CHANGED
@@ -1,41 +1,23 @@
1
1
  #include "gyro.h"
2
2
 
3
3
  struct Gyro_Async {
4
- struct ev_async ev_async;
5
- struct ev_loop *ev_loop;
6
- int active;
7
- VALUE self;
8
- VALUE fiber;
9
- VALUE value;
10
- VALUE selector;
4
+ GYRO_WATCHER_DECL(ev_async);
5
+ VALUE value;
11
6
  };
12
7
 
13
8
  VALUE cGyro_Async = Qnil;
14
9
 
15
10
  static void Gyro_Async_mark(void *ptr) {
16
11
  struct Gyro_Async *async = ptr;
17
- if (async->fiber != Qnil) {
18
- rb_gc_mark(async->fiber);
19
- }
20
- if (async->value != Qnil) {
21
- rb_gc_mark(async->value);
22
- }
23
- if (async->selector != Qnil) {
24
- rb_gc_mark(async->selector);
25
- }
12
+
13
+ GYRO_WATCHER_MARK(async);
14
+ if (async->value != Qnil) rb_gc_mark(async->value);
26
15
  }
27
16
 
28
17
  static void Gyro_Async_free(void *ptr) {
29
18
  struct Gyro_Async *async = ptr;
30
- switch (async->active) {
31
- case GYRO_WATCHER_POST_FORK:
32
- return;
33
- case 1:
34
- ev_clear_pending(async->ev_loop, &async->ev_async);
35
- ev_async_stop(async->ev_loop, &async->ev_async);
36
- default:
37
- xfree(async);
38
- }
19
+
20
+ GYRO_WATCHER_FREE(async);
39
21
  }
40
22
 
41
23
  static size_t Gyro_Async_size(const void *ptr) {
@@ -50,6 +32,7 @@ static const rb_data_type_t Gyro_Async_type = {
50
32
 
51
33
  static VALUE Gyro_Async_allocate(VALUE klass) {
52
34
  struct Gyro_Async *async = ALLOC(struct Gyro_Async);
35
+
53
36
  return TypedData_Wrap_Struct(klass, &Gyro_Async_type, async);
54
37
  }
55
38
 
@@ -90,13 +73,8 @@ static VALUE Gyro_Async_initialize(VALUE self) {
90
73
  struct Gyro_Async *async;
91
74
  GetGyro_Async(self, async);
92
75
 
93
- async->self = self;
94
- async->fiber = Qnil;
76
+ GYRO_WATCHER_INITIALIZE(async, self);
95
77
  async->value = Qnil;
96
- async->selector = Qnil;
97
- async->active = 0;
98
- async->ev_loop = 0;
99
-
100
78
  ev_async_init(&async->ev_async, Gyro_Async_callback);
101
79
 
102
80
  return Qnil;
@@ -119,10 +97,11 @@ static VALUE Gyro_Async_signal(int argc, VALUE *argv, VALUE self) {
119
97
 
120
98
  VALUE Gyro_Async_await(VALUE self) {
121
99
  struct Gyro_Async *async;
100
+ VALUE ret;
122
101
  GetGyro_Async(self, async);
123
102
 
124
103
  async_activate(async);
125
- VALUE ret = Gyro_switchpoint();
104
+ ret = Gyro_switchpoint();
126
105
  async_deactivate(async);
127
106
 
128
107
  TEST_RESUME_EXCEPTION(ret);
@@ -130,23 +109,15 @@ VALUE Gyro_Async_await(VALUE self) {
130
109
  return ret;
131
110
  }
132
111
 
133
- VALUE Gyro_Async_deactivate_post_fork(VALUE self) {
134
- struct Gyro_Async *async;
135
- GetGyro_Async(self, async);
136
-
137
- if (async->active)
138
- async->active = GYRO_WATCHER_POST_FORK;
139
- return self;
140
- }
141
-
142
112
  VALUE Gyro_Async_await_no_raise(VALUE self) {
143
113
  struct Gyro_Async *async;
114
+ VALUE ret;
144
115
  GetGyro_Async(self, async);
145
116
 
146
117
  async_activate(async);
147
- VALUE ret = Gyro_switchpoint();
118
+ ret = Gyro_switchpoint();
148
119
  async_deactivate(async);
149
-
120
+
150
121
  RB_GC_GUARD(ret);
151
122
  return ret;
152
123
  }
@@ -157,6 +128,5 @@ void Init_Gyro_Async() {
157
128
 
158
129
  rb_define_method(cGyro_Async, "initialize", Gyro_Async_initialize, 0);
159
130
  rb_define_method(cGyro_Async, "await", Gyro_Async_await, 0);
160
- rb_define_method(cGyro_Async, "deactivate_post_fork", Gyro_Async_deactivate_post_fork, 0);
161
131
  rb_define_method(cGyro_Async, "signal", Gyro_Async_signal, -1);
162
- }
132
+ }
data/ext/gyro/child.c CHANGED
@@ -1,38 +1,20 @@
1
1
  #include "gyro.h"
2
2
 
3
3
  struct Gyro_Child {
4
- struct ev_child ev_child;
5
- struct ev_loop *ev_loop;
6
- int active;
7
- int pid;
8
- VALUE self;
9
- VALUE fiber;
10
- VALUE selector;
4
+ GYRO_WATCHER_DECL(ev_child);
5
+ int pid;
11
6
  };
12
7
 
13
8
  static VALUE cGyro_Child = Qnil;
14
9
 
15
10
  static void Gyro_Child_mark(void *ptr) {
16
11
  struct Gyro_Child *child = ptr;
17
- if (child->fiber != Qnil) {
18
- rb_gc_mark(child->fiber);
19
- }
20
- if (child->selector != Qnil) {
21
- rb_gc_mark(child->selector);
22
- }
12
+ GYRO_WATCHER_MARK(child);
23
13
  }
24
14
 
25
15
  static void Gyro_Child_free(void *ptr) {
26
16
  struct Gyro_Child *child = ptr;
27
- switch (child->active) {
28
- case GYRO_WATCHER_POST_FORK:
29
- return;
30
- case 1:
31
- ev_clear_pending(child->ev_loop, &child->ev_child);
32
- ev_child_stop(child->ev_loop, &child->ev_child);
33
- default:
34
- xfree(child);
35
- }
17
+ GYRO_WATCHER_FREE(child);
36
18
  }
37
19
 
38
20
  static size_t Gyro_Child_size(const void *ptr) {
@@ -96,14 +78,8 @@ static VALUE Gyro_Child_initialize(VALUE self, VALUE pid) {
96
78
  struct Gyro_Child *child;
97
79
 
98
80
  GetGyro_Child(self, child);
99
-
100
- child->self = self;
101
- child->fiber = Qnil;
102
- child->selector = Qnil;
103
- child->pid = NUM2INT(pid);
104
- child->active = 0;
105
- child->ev_loop = 0;
106
-
81
+ GYRO_WATCHER_INITIALIZE(child, self);
82
+ child->pid = NUM2INT(pid);
107
83
  ev_child_init(&child->ev_child, Gyro_Child_callback, child->pid, 0);
108
84
 
109
85
  return Qnil;
@@ -111,10 +87,11 @@ static VALUE Gyro_Child_initialize(VALUE self, VALUE pid) {
111
87
 
112
88
  static VALUE Gyro_Child_await(VALUE self) {
113
89
  struct Gyro_Child *child;
90
+ VALUE ret;
114
91
  GetGyro_Child(self, child);
115
92
 
116
93
  child_activate(child);
117
- VALUE ret = Gyro_switchpoint();
94
+ ret = Gyro_switchpoint();
118
95
  child_deactivate(child);
119
96
 
120
97
  TEST_RESUME_EXCEPTION(ret);
@@ -122,20 +99,10 @@ static VALUE Gyro_Child_await(VALUE self) {
122
99
  return ret;
123
100
  }
124
101
 
125
- VALUE Gyro_Child_deactivate_post_fork(VALUE self) {
126
- struct Gyro_Child *child;
127
- GetGyro_Child(self, child);
128
-
129
- if (child->active)
130
- child->active = GYRO_WATCHER_POST_FORK;
131
- return self;
132
- }
133
-
134
102
  void Init_Gyro_Child() {
135
103
  cGyro_Child = rb_define_class_under(mGyro, "Child", rb_cData);
136
104
  rb_define_alloc_func(cGyro_Child, Gyro_Child_allocate);
137
105
 
138
106
  rb_define_method(cGyro_Child, "initialize", Gyro_Child_initialize, 1);
139
107
  rb_define_method(cGyro_Child, "await", Gyro_Child_await, 0);
140
- rb_define_method(cGyro_Child, "deactivate_post_fork", Gyro_Child_deactivate_post_fork, 0);
141
108
  }
data/ext/gyro/fiber.c CHANGED
@@ -26,7 +26,7 @@ VALUE SYM_fiber_terminate;
26
26
  static VALUE Fiber_safe_transfer(int argc, VALUE *argv, VALUE self) {
27
27
  VALUE arg = (argc == 0) ? Qnil : argv[0];
28
28
  VALUE ret = rb_funcall(self, ID_transfer, 1, arg);
29
-
29
+
30
30
  TEST_RESUME_EXCEPTION(ret);
31
31
  RB_GC_GUARD(ret);
32
32
  return ret;
@@ -61,7 +61,7 @@ static VALUE Fiber_state(VALUE self) {
61
61
  return SYM_dead;
62
62
  if (rb_fiber_current() == self) return SYM_running;
63
63
  if (rb_ivar_get(self, ID_runnable) != Qnil) return SYM_runnable;
64
-
64
+
65
65
  return SYM_waiting;
66
66
  }
67
67
 
@@ -71,8 +71,9 @@ void Fiber_make_runnable(VALUE fiber, VALUE value) {
71
71
  Thread_schedule_fiber(thread, fiber, value);
72
72
  }
73
73
  else {
74
+ VALUE caller;
74
75
  rb_warn("No thread set for fiber (fiber, value, caller):");
75
- VALUE caller = rb_funcall(rb_cObject, rb_intern("caller"), 0);
76
+ caller = rb_funcall(rb_cObject, rb_intern("caller"), 0);
76
77
  INSPECT(3, fiber, value, caller);
77
78
  }
78
79
  }
data/ext/gyro/gyro.c CHANGED
@@ -1,6 +1,7 @@
1
1
  #include "gyro.h"
2
2
 
3
3
  VALUE mGyro;
4
+ int __gyro_current_generation__ = 0;
4
5
 
5
6
  ID ID_call;
6
7
  ID ID_caller;
@@ -24,21 +25,12 @@ ID ID_R;
24
25
  ID ID_W;
25
26
  ID ID_RW;
26
27
 
27
- static VALUE Gyro_break_set(VALUE self) {
28
- // break_flag = 1;
29
- ev_break(Gyro_Selector_current_thread_ev_loop(), EVBREAK_ALL);
30
- return Qnil;
31
- }
32
-
33
- // static VALUE Gyro_break_get(VALUE self) {
34
- // return (break_flag == 0) ? Qfalse : Qtrue;
35
- // }
36
-
37
28
  VALUE Gyro_snooze(VALUE self) {
29
+ VALUE ret;
38
30
  VALUE fiber = rb_fiber_current();
39
- Fiber_make_runnable(fiber, Qnil);
40
31
 
41
- VALUE ret = Thread_switch_fiber(rb_thread_current());
32
+ Fiber_make_runnable(fiber, Qnil);
33
+ ret = Thread_switch_fiber(rb_thread_current());
42
34
  TEST_RESUME_EXCEPTION(ret);
43
35
  RB_GC_GUARD(ret);
44
36
  return ret;
@@ -54,7 +46,7 @@ static VALUE Gyro_unref(VALUE self) {
54
46
 
55
47
  static VALUE Gyro_suspend(VALUE self) {
56
48
  VALUE ret = Thread_switch_fiber(rb_thread_current());
57
-
49
+
58
50
  TEST_RESUME_EXCEPTION(ret);
59
51
  RB_GC_GUARD(ret);
60
52
  return ret;
@@ -65,15 +57,18 @@ VALUE Gyro_trace(VALUE self, VALUE enabled) {
65
57
  return Qnil;
66
58
  }
67
59
 
60
+ VALUE Gyro_incr_generation(VALUE self) {
61
+ __gyro_current_generation__++;
62
+ return Qnil;
63
+ }
64
+
68
65
  void Init_Gyro() {
69
66
  mGyro = rb_define_module("Gyro");
70
67
 
68
+ rb_define_singleton_method(mGyro, "incr_generation", Gyro_incr_generation, 0);
71
69
  rb_define_singleton_method(mGyro, "ref", Gyro_ref, 0);
72
- rb_define_singleton_method(mGyro, "unref", Gyro_unref, 0);
73
70
  rb_define_singleton_method(mGyro, "trace", Gyro_trace, 1);
74
-
75
- rb_define_singleton_method(mGyro, "break!", Gyro_break_set, 0);
76
- // rb_define_singleton_method(mGyro, "break?", Gyro_break_get, 0);
71
+ rb_define_singleton_method(mGyro, "unref", Gyro_unref, 0);
77
72
 
78
73
  rb_define_global_function("snooze", Gyro_snooze, 0);
79
74
  rb_define_global_function("suspend", Gyro_suspend, 0);
data/ext/gyro/gyro.h CHANGED
@@ -16,6 +16,53 @@
16
16
  return rb_funcall(rb_mKernel, ID_raise, 1, ret); \
17
17
  }
18
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
+
19
66
  extern VALUE mGyro;
20
67
  extern VALUE cGyro_Async;
21
68
  extern VALUE cGyro_IO;
@@ -52,6 +99,7 @@ extern VALUE SYM_fiber_switchpoint;
52
99
  extern VALUE SYM_fiber_terminate;
53
100
 
54
101
  extern int __tracing_enabled__;
102
+ extern int __gyro_current_generation__;
55
103
 
56
104
  enum {
57
105
  FIBER_STATE_NOT_SCHEDULED = 0,
data/ext/gyro/io.c CHANGED
@@ -7,12 +7,7 @@
7
7
  #endif /* GetReadFile */
8
8
 
9
9
  struct Gyro_IO {
10
- struct ev_io ev_io;
11
- struct ev_loop *ev_loop;
12
- int active;
13
- VALUE self;
14
- VALUE fiber;
15
- VALUE selector;
10
+ GYRO_WATCHER_DECL(ev_io);
16
11
  };
17
12
 
18
13
  VALUE cGyro_IO = Qnil;
@@ -24,25 +19,12 @@ VALUE SYM_w;
24
19
 
25
20
  static void Gyro_IO_mark(void *ptr) {
26
21
  struct Gyro_IO *io = ptr;
27
- if (io->fiber != Qnil) {
28
- rb_gc_mark(io->fiber);
29
- }
30
- if (io->selector != Qnil) {
31
- rb_gc_mark(io->selector);
32
- }
22
+ GYRO_WATCHER_MARK(io);
33
23
  }
34
24
 
35
25
  static void Gyro_IO_free(void *ptr) {
36
26
  struct Gyro_IO *io = ptr;
37
- switch (io->active) {
38
- case GYRO_WATCHER_POST_FORK:
39
- return;
40
- case 1:
41
- ev_clear_pending(io->ev_loop, &io->ev_io);
42
- ev_io_stop(io->ev_loop, &io->ev_io);
43
- default:
44
- xfree(io);
45
- }
27
+ GYRO_WATCHER_FREE(io);
46
28
  }
47
29
 
48
30
  static size_t Gyro_IO_size(const void *ptr) {
@@ -119,16 +101,11 @@ static const char * S_to_io = "to_io";
119
101
  static VALUE Gyro_IO_initialize(VALUE self, VALUE io_obj, VALUE event_mask) {
120
102
  struct Gyro_IO *io;
121
103
  rb_io_t *fptr;
104
+ int fd;
105
+ int events;
122
106
 
123
107
  GetGyro_IO(self, io);
124
-
125
- io->self = self;
126
- io->fiber = Qnil;
127
- io->selector = Qnil;
128
- io->active = 0;
129
- io->ev_loop = 0;
130
-
131
- int fd;
108
+ GYRO_WATCHER_INITIALIZE(io, self);
132
109
  if (NIL_P(io_obj)) {
133
110
  fd = 0;
134
111
  }
@@ -136,8 +113,7 @@ static VALUE Gyro_IO_initialize(VALUE self, VALUE io_obj, VALUE event_mask) {
136
113
  GetOpenFile(rb_convert_type(io_obj, T_FILE, S_IO, S_to_io), fptr);
137
114
  fd = FPTR_TO_FD(fptr);
138
115
  }
139
- int events = Gyro_IO_symbol2event_mask(event_mask);
140
-
116
+ events = Gyro_IO_symbol2event_mask(event_mask);
141
117
  ev_io_init(&io->ev_io, Gyro_IO_callback, fd, events);
142
118
 
143
119
  return Qnil;
@@ -145,10 +121,11 @@ static VALUE Gyro_IO_initialize(VALUE self, VALUE io_obj, VALUE event_mask) {
145
121
 
146
122
  VALUE Gyro_IO_await(VALUE self) {
147
123
  struct Gyro_IO *io;
124
+ VALUE ret;
148
125
  GetGyro_IO(self, io);
149
126
 
150
127
  io_activate(io);
151
- VALUE ret = Gyro_switchpoint();
128
+ ret = Gyro_switchpoint();
152
129
  io_deactivate(io);
153
130
 
154
131
  TEST_RESUME_EXCEPTION(ret);
@@ -156,16 +133,6 @@ VALUE Gyro_IO_await(VALUE self) {
156
133
  return ret;
157
134
  }
158
135
 
159
- VALUE Gyro_IO_deactivate_post_fork(VALUE self) {
160
- struct Gyro_IO *io;
161
- GetGyro_IO(self, io);
162
-
163
- if (io->active)
164
- io->active = GYRO_WATCHER_POST_FORK;
165
-
166
- return self;
167
- }
168
-
169
136
  VALUE Gyro_IO_auto_io(int fd, int events) {
170
137
  VALUE watcher = Fiber_auto_io(rb_fiber_current());
171
138
  struct Gyro_IO *io;
@@ -265,7 +232,7 @@ static VALUE IO_read(int argc, VALUE *argv, VALUE io) {
265
232
 
266
233
  if (len == 0)
267
234
  return str;
268
-
235
+
269
236
  char *buf = RSTRING_PTR(str);
270
237
  long total = 0;
271
238
 
@@ -462,14 +429,15 @@ VALUE IO_write_watcher(VALUE self) {
462
429
  }
463
430
 
464
431
  void Init_Gyro_IO() {
432
+ VALUE cIO;
433
+
465
434
  cGyro_IO = rb_define_class_under(mGyro, "IO", rb_cData);
466
435
  rb_define_alloc_func(cGyro_IO, Gyro_IO_allocate);
467
436
 
468
437
  rb_define_method(cGyro_IO, "initialize", Gyro_IO_initialize, 2);
469
438
  rb_define_method(cGyro_IO, "await", Gyro_IO_await, 0);
470
- rb_define_method(cGyro_IO, "deactivate_post_fork", Gyro_IO_deactivate_post_fork, 0);
471
439
 
472
- VALUE cIO = rb_const_get(rb_cObject, rb_intern("IO"));
440
+ cIO = rb_const_get(rb_cObject, rb_intern("IO"));
473
441
  // rb_define_method(cIO, "gets", IO_gets, -1);
474
442
  rb_define_method(cIO, "read", IO_read, -1);
475
443
  rb_define_method(cIO, "readpartial", IO_readpartial, -1);