nio4r 0.4.0 → 0.5.0

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.
data/ext/libev/ev_wrap.h CHANGED
@@ -1,198 +1,200 @@
1
1
  /* DO NOT EDIT, automatically generated by update_ev_wrap */
2
2
  #ifndef EV_WRAP_H
3
3
  #define EV_WRAP_H
4
- #define now_floor ((loop)->now_floor)
5
- #define mn_now ((loop)->mn_now)
6
- #define rtmn_diff ((loop)->rtmn_diff)
7
- #define io_blocktime ((loop)->io_blocktime)
8
- #define timeout_blocktime ((loop)->timeout_blocktime)
9
- #define backend ((loop)->backend)
4
+ #define acquire_cb ((loop)->acquire_cb)
10
5
  #define activecnt ((loop)->activecnt)
11
- #define loop_done ((loop)->loop_done)
6
+ #define anfdmax ((loop)->anfdmax)
7
+ #define anfds ((loop)->anfds)
8
+ #define async_pending ((loop)->async_pending)
9
+ #define asynccnt ((loop)->asynccnt)
10
+ #define asyncmax ((loop)->asyncmax)
11
+ #define asyncs ((loop)->asyncs)
12
+ #define backend ((loop)->backend)
12
13
  #define backend_fd ((loop)->backend_fd)
13
14
  #define backend_mintime ((loop)->backend_mintime)
14
15
  #define backend_modify ((loop)->backend_modify)
15
16
  #define backend_poll ((loop)->backend_poll)
16
- #define anfds ((loop)->anfds)
17
- #define anfdmax ((loop)->anfdmax)
18
- #define pendings ((loop)->pendings)
19
- #define pendingmax ((loop)->pendingmax)
20
- #define pendingcnt ((loop)->pendingcnt)
21
- #define pending_w ((loop)->pending_w)
22
- #define rfeeds ((loop)->rfeeds)
23
- #define rfeedmax ((loop)->rfeedmax)
24
- #define rfeedcnt ((loop)->rfeedcnt)
25
- #define evfd ((loop)->evfd)
26
- #define evpipe ((loop)->evpipe)
27
- #define pipe_w ((loop)->pipe_w)
28
- #define pipe_write_wanted ((loop)->pipe_write_wanted)
29
- #define pipe_write_skipped ((loop)->pipe_write_skipped)
17
+ #define checkcnt ((loop)->checkcnt)
18
+ #define checkmax ((loop)->checkmax)
19
+ #define checks ((loop)->checks)
20
+ #define cleanupcnt ((loop)->cleanupcnt)
21
+ #define cleanupmax ((loop)->cleanupmax)
22
+ #define cleanups ((loop)->cleanups)
30
23
  #define curpid ((loop)->curpid)
31
- #define postfork ((loop)->postfork)
32
- #define vec_ri ((loop)->vec_ri)
33
- #define vec_ro ((loop)->vec_ro)
34
- #define vec_wi ((loop)->vec_wi)
35
- #define vec_wo ((loop)->vec_wo)
36
- #define vec_eo ((loop)->vec_eo)
37
- #define vec_max ((loop)->vec_max)
38
- #define polls ((loop)->polls)
39
- #define pollmax ((loop)->pollmax)
40
- #define pollcnt ((loop)->pollcnt)
41
- #define pollidxs ((loop)->pollidxs)
42
- #define pollidxmax ((loop)->pollidxmax)
43
- #define epoll_events ((loop)->epoll_events)
44
- #define epoll_eventmax ((loop)->epoll_eventmax)
45
- #define epoll_eperms ((loop)->epoll_eperms)
46
24
  #define epoll_epermcnt ((loop)->epoll_epermcnt)
47
25
  #define epoll_epermmax ((loop)->epoll_epermmax)
48
- #define kqueue_changes ((loop)->kqueue_changes)
49
- #define kqueue_changemax ((loop)->kqueue_changemax)
50
- #define kqueue_changecnt ((loop)->kqueue_changecnt)
51
- #define kqueue_events ((loop)->kqueue_events)
52
- #define kqueue_eventmax ((loop)->kqueue_eventmax)
53
- #define port_events ((loop)->port_events)
54
- #define port_eventmax ((loop)->port_eventmax)
55
- #define iocp ((loop)->iocp)
56
- #define fdchanges ((loop)->fdchanges)
57
- #define fdchangemax ((loop)->fdchangemax)
26
+ #define epoll_eperms ((loop)->epoll_eperms)
27
+ #define epoll_eventmax ((loop)->epoll_eventmax)
28
+ #define epoll_events ((loop)->epoll_events)
29
+ #define evpipe ((loop)->evpipe)
58
30
  #define fdchangecnt ((loop)->fdchangecnt)
59
- #define timers ((loop)->timers)
60
- #define timermax ((loop)->timermax)
61
- #define timercnt ((loop)->timercnt)
62
- #define periodics ((loop)->periodics)
63
- #define periodicmax ((loop)->periodicmax)
64
- #define periodiccnt ((loop)->periodiccnt)
65
- #define idles ((loop)->idles)
66
- #define idlemax ((loop)->idlemax)
67
- #define idlecnt ((loop)->idlecnt)
68
- #define idleall ((loop)->idleall)
69
- #define prepares ((loop)->prepares)
70
- #define preparemax ((loop)->preparemax)
71
- #define preparecnt ((loop)->preparecnt)
72
- #define checks ((loop)->checks)
73
- #define checkmax ((loop)->checkmax)
74
- #define checkcnt ((loop)->checkcnt)
75
- #define forks ((loop)->forks)
76
- #define forkmax ((loop)->forkmax)
31
+ #define fdchangemax ((loop)->fdchangemax)
32
+ #define fdchanges ((loop)->fdchanges)
77
33
  #define forkcnt ((loop)->forkcnt)
78
- #define cleanups ((loop)->cleanups)
79
- #define cleanupmax ((loop)->cleanupmax)
80
- #define cleanupcnt ((loop)->cleanupcnt)
81
- #define async_pending ((loop)->async_pending)
82
- #define asyncs ((loop)->asyncs)
83
- #define asyncmax ((loop)->asyncmax)
84
- #define asynccnt ((loop)->asynccnt)
85
- #define fs_fd ((loop)->fs_fd)
86
- #define fs_w ((loop)->fs_w)
34
+ #define forkmax ((loop)->forkmax)
35
+ #define forks ((loop)->forks)
87
36
  #define fs_2625 ((loop)->fs_2625)
37
+ #define fs_fd ((loop)->fs_fd)
88
38
  #define fs_hash ((loop)->fs_hash)
39
+ #define fs_w ((loop)->fs_w)
40
+ #define idleall ((loop)->idleall)
41
+ #define idlecnt ((loop)->idlecnt)
42
+ #define idlemax ((loop)->idlemax)
43
+ #define idles ((loop)->idles)
44
+ #define invoke_cb ((loop)->invoke_cb)
45
+ #define io_blocktime ((loop)->io_blocktime)
46
+ #define iocp ((loop)->iocp)
47
+ #define kqueue_changecnt ((loop)->kqueue_changecnt)
48
+ #define kqueue_changemax ((loop)->kqueue_changemax)
49
+ #define kqueue_changes ((loop)->kqueue_changes)
50
+ #define kqueue_eventmax ((loop)->kqueue_eventmax)
51
+ #define kqueue_events ((loop)->kqueue_events)
52
+ #define kqueue_fd_pid ((loop)->kqueue_fd_pid)
53
+ #define loop_count ((loop)->loop_count)
54
+ #define loop_depth ((loop)->loop_depth)
55
+ #define loop_done ((loop)->loop_done)
56
+ #define mn_now ((loop)->mn_now)
57
+ #define now_floor ((loop)->now_floor)
58
+ #define origflags ((loop)->origflags)
59
+ #define pending_w ((loop)->pending_w)
60
+ #define pendingcnt ((loop)->pendingcnt)
61
+ #define pendingmax ((loop)->pendingmax)
62
+ #define pendingpri ((loop)->pendingpri)
63
+ #define pendings ((loop)->pendings)
64
+ #define periodiccnt ((loop)->periodiccnt)
65
+ #define periodicmax ((loop)->periodicmax)
66
+ #define periodics ((loop)->periodics)
67
+ #define pipe_w ((loop)->pipe_w)
68
+ #define pipe_write_skipped ((loop)->pipe_write_skipped)
69
+ #define pipe_write_wanted ((loop)->pipe_write_wanted)
70
+ #define pollcnt ((loop)->pollcnt)
71
+ #define pollidxmax ((loop)->pollidxmax)
72
+ #define pollidxs ((loop)->pollidxs)
73
+ #define pollmax ((loop)->pollmax)
74
+ #define polls ((loop)->polls)
75
+ #define port_eventmax ((loop)->port_eventmax)
76
+ #define port_events ((loop)->port_events)
77
+ #define postfork ((loop)->postfork)
78
+ #define preparecnt ((loop)->preparecnt)
79
+ #define preparemax ((loop)->preparemax)
80
+ #define prepares ((loop)->prepares)
81
+ #define release_cb ((loop)->release_cb)
82
+ #define rfeedcnt ((loop)->rfeedcnt)
83
+ #define rfeedmax ((loop)->rfeedmax)
84
+ #define rfeeds ((loop)->rfeeds)
85
+ #define rtmn_diff ((loop)->rtmn_diff)
89
86
  #define sig_pending ((loop)->sig_pending)
90
87
  #define sigfd ((loop)->sigfd)
91
- #define sigfd_w ((loop)->sigfd_w)
92
88
  #define sigfd_set ((loop)->sigfd_set)
93
- #define origflags ((loop)->origflags)
94
- #define loop_count ((loop)->loop_count)
95
- #define loop_depth ((loop)->loop_depth)
89
+ #define sigfd_w ((loop)->sigfd_w)
90
+ #define timeout_blocktime ((loop)->timeout_blocktime)
91
+ #define timercnt ((loop)->timercnt)
92
+ #define timermax ((loop)->timermax)
93
+ #define timers ((loop)->timers)
96
94
  #define userdata ((loop)->userdata)
97
- #define release_cb ((loop)->release_cb)
98
- #define acquire_cb ((loop)->acquire_cb)
99
- #define invoke_cb ((loop)->invoke_cb)
95
+ #define vec_eo ((loop)->vec_eo)
96
+ #define vec_max ((loop)->vec_max)
97
+ #define vec_ri ((loop)->vec_ri)
98
+ #define vec_ro ((loop)->vec_ro)
99
+ #define vec_wi ((loop)->vec_wi)
100
+ #define vec_wo ((loop)->vec_wo)
100
101
  #else
101
102
  #undef EV_WRAP_H
102
- #undef now_floor
103
- #undef mn_now
104
- #undef rtmn_diff
105
- #undef io_blocktime
106
- #undef timeout_blocktime
107
- #undef backend
103
+ #undef acquire_cb
108
104
  #undef activecnt
109
- #undef loop_done
105
+ #undef anfdmax
106
+ #undef anfds
107
+ #undef async_pending
108
+ #undef asynccnt
109
+ #undef asyncmax
110
+ #undef asyncs
111
+ #undef backend
110
112
  #undef backend_fd
111
113
  #undef backend_mintime
112
114
  #undef backend_modify
113
115
  #undef backend_poll
114
- #undef anfds
115
- #undef anfdmax
116
- #undef pendings
117
- #undef pendingmax
118
- #undef pendingcnt
119
- #undef pending_w
120
- #undef rfeeds
121
- #undef rfeedmax
122
- #undef rfeedcnt
123
- #undef evfd
124
- #undef evpipe
125
- #undef pipe_w
126
- #undef pipe_write_wanted
127
- #undef pipe_write_skipped
116
+ #undef checkcnt
117
+ #undef checkmax
118
+ #undef checks
119
+ #undef cleanupcnt
120
+ #undef cleanupmax
121
+ #undef cleanups
128
122
  #undef curpid
129
- #undef postfork
130
- #undef vec_ri
131
- #undef vec_ro
132
- #undef vec_wi
133
- #undef vec_wo
134
- #undef vec_eo
135
- #undef vec_max
136
- #undef polls
137
- #undef pollmax
138
- #undef pollcnt
139
- #undef pollidxs
140
- #undef pollidxmax
141
- #undef epoll_events
142
- #undef epoll_eventmax
143
- #undef epoll_eperms
144
123
  #undef epoll_epermcnt
145
124
  #undef epoll_epermmax
146
- #undef kqueue_changes
147
- #undef kqueue_changemax
148
- #undef kqueue_changecnt
149
- #undef kqueue_events
150
- #undef kqueue_eventmax
151
- #undef port_events
152
- #undef port_eventmax
153
- #undef iocp
154
- #undef fdchanges
155
- #undef fdchangemax
125
+ #undef epoll_eperms
126
+ #undef epoll_eventmax
127
+ #undef epoll_events
128
+ #undef evpipe
156
129
  #undef fdchangecnt
157
- #undef timers
158
- #undef timermax
159
- #undef timercnt
160
- #undef periodics
161
- #undef periodicmax
162
- #undef periodiccnt
163
- #undef idles
164
- #undef idlemax
165
- #undef idlecnt
166
- #undef idleall
167
- #undef prepares
168
- #undef preparemax
169
- #undef preparecnt
170
- #undef checks
171
- #undef checkmax
172
- #undef checkcnt
173
- #undef forks
174
- #undef forkmax
130
+ #undef fdchangemax
131
+ #undef fdchanges
175
132
  #undef forkcnt
176
- #undef cleanups
177
- #undef cleanupmax
178
- #undef cleanupcnt
179
- #undef async_pending
180
- #undef asyncs
181
- #undef asyncmax
182
- #undef asynccnt
183
- #undef fs_fd
184
- #undef fs_w
133
+ #undef forkmax
134
+ #undef forks
185
135
  #undef fs_2625
136
+ #undef fs_fd
186
137
  #undef fs_hash
138
+ #undef fs_w
139
+ #undef idleall
140
+ #undef idlecnt
141
+ #undef idlemax
142
+ #undef idles
143
+ #undef invoke_cb
144
+ #undef io_blocktime
145
+ #undef iocp
146
+ #undef kqueue_changecnt
147
+ #undef kqueue_changemax
148
+ #undef kqueue_changes
149
+ #undef kqueue_eventmax
150
+ #undef kqueue_events
151
+ #undef kqueue_fd_pid
152
+ #undef loop_count
153
+ #undef loop_depth
154
+ #undef loop_done
155
+ #undef mn_now
156
+ #undef now_floor
157
+ #undef origflags
158
+ #undef pending_w
159
+ #undef pendingcnt
160
+ #undef pendingmax
161
+ #undef pendingpri
162
+ #undef pendings
163
+ #undef periodiccnt
164
+ #undef periodicmax
165
+ #undef periodics
166
+ #undef pipe_w
167
+ #undef pipe_write_skipped
168
+ #undef pipe_write_wanted
169
+ #undef pollcnt
170
+ #undef pollidxmax
171
+ #undef pollidxs
172
+ #undef pollmax
173
+ #undef polls
174
+ #undef port_eventmax
175
+ #undef port_events
176
+ #undef postfork
177
+ #undef preparecnt
178
+ #undef preparemax
179
+ #undef prepares
180
+ #undef release_cb
181
+ #undef rfeedcnt
182
+ #undef rfeedmax
183
+ #undef rfeeds
184
+ #undef rtmn_diff
187
185
  #undef sig_pending
188
186
  #undef sigfd
189
- #undef sigfd_w
190
187
  #undef sigfd_set
191
- #undef origflags
192
- #undef loop_count
193
- #undef loop_depth
188
+ #undef sigfd_w
189
+ #undef timeout_blocktime
190
+ #undef timercnt
191
+ #undef timermax
192
+ #undef timers
194
193
  #undef userdata
195
- #undef release_cb
196
- #undef acquire_cb
197
- #undef invoke_cb
194
+ #undef vec_eo
195
+ #undef vec_max
196
+ #undef vec_ri
197
+ #undef vec_ro
198
+ #undef vec_wi
199
+ #undef vec_wo
198
200
  #endif
data/ext/nio4r/libev.h CHANGED
@@ -2,7 +2,8 @@
2
2
 
3
3
  #ifdef _WIN32
4
4
  #define EV_SELECT_IS_WINSOCKET 1
5
- #define FD_SETSIZE 512
5
+ #define EV_USE_MONOTONIC 0
6
+ #define EV_USE_REALTIME 0
6
7
  #endif
7
8
 
8
9
  #include "../libev/ev.h"
@@ -130,7 +130,7 @@ public class Nio4r implements Library {
130
130
  Ruby runtime = context.getRuntime();
131
131
  return this.selector.isOpen() ? runtime.getFalse() : runtime.getTrue();
132
132
  }
133
-
133
+
134
134
  @JRubyMethod(name = "empty?")
135
135
  public IRubyObject isEmpty(ThreadContext context) {
136
136
  Ruby runtime = context.getRuntime();
@@ -142,6 +142,10 @@ public class Nio4r implements Library {
142
142
  Ruby runtime = context.getRuntime();
143
143
  Channel rawChannel = RubyIO.convertToIO(context, io).getChannel();
144
144
 
145
+ if(!this.selector.isOpen()) {
146
+ throw context.getRuntime().newIOError("selector is closed");
147
+ }
148
+
145
149
  if(!(rawChannel instanceof SelectableChannel)) {
146
150
  throw runtime.newArgumentError("not a selectable IO object");
147
151
  }
@@ -231,7 +235,7 @@ public class Nio4r implements Library {
231
235
  @JRubyMethod
232
236
  public synchronized IRubyObject select(ThreadContext context, IRubyObject timeout, Block block) {
233
237
  Ruby runtime = context.getRuntime();
234
- int ready = doSelect(runtime, timeout);
238
+ int ready = doSelect(runtime, context, timeout);
235
239
 
236
240
  /* Timeout or wakeup */
237
241
  if(ready <= 0)
@@ -263,21 +267,26 @@ public class Nio4r implements Library {
263
267
  }
264
268
 
265
269
  /* Run the selector */
266
- private int doSelect(Ruby runtime, IRubyObject timeout) {
270
+ private int doSelect(Ruby runtime, ThreadContext context, IRubyObject timeout) {
271
+ int result;
272
+
267
273
  cancelKeys();
268
274
  try {
275
+ context.getThread().beforeBlockingCall();
269
276
  if(timeout.isNil()) {
270
- return this.selector.select();
277
+ result = this.selector.select();
271
278
  } else {
272
279
  double t = RubyNumeric.num2dbl(timeout);
273
280
  if(t == 0) {
274
- return this.selector.selectNow();
281
+ result = this.selector.selectNow();
275
282
  } else if(t < 0) {
276
283
  throw runtime.newArgumentError("time interval must be positive");
277
284
  } else {
278
- return this.selector.select((long)(t * 1000));
285
+ result = this.selector.select((long)(t * 1000));
279
286
  }
280
287
  }
288
+ context.getThread().afterBlockingCall();
289
+ return result;
281
290
  } catch(IOException ie) {
282
291
  throw runtime.newIOError(ie.getLocalizedMessage());
283
292
  }
data/ext/nio4r/selector.c CHANGED
@@ -36,6 +36,9 @@ static VALUE NIO_Selector_unlock(VALUE lock);
36
36
  static VALUE NIO_Selector_register_synchronized(VALUE *args);
37
37
  static VALUE NIO_Selector_deregister_synchronized(VALUE *args);
38
38
  static VALUE NIO_Selector_select_synchronized(VALUE *args);
39
+ static VALUE NIO_Selector_close_synchronized(VALUE self);
40
+ static VALUE NIO_Selector_closed_synchronized(VALUE self);
41
+
39
42
  static int NIO_Selector_run(struct NIO_Selector *selector, VALUE timeout);
40
43
  static void NIO_Selector_timeout_callback(struct ev_loop *ev_loop, struct ev_timer *timer, int revents);
41
44
  static void NIO_Selector_wakeup_callback(struct ev_loop *ev_loop, struct ev_io *io, int revents);
@@ -115,11 +118,6 @@ static void NIO_Selector_mark(struct NIO_Selector *selector)
115
118
  Called by both NIO::Selector#close and the finalizer below */
116
119
  static void NIO_Selector_shutdown(struct NIO_Selector *selector)
117
120
  {
118
- if(selector->ev_loop) {
119
- ev_loop_destroy(selector->ev_loop);
120
- selector->ev_loop = 0;
121
- }
122
-
123
121
  if(selector->closed) {
124
122
  return;
125
123
  }
@@ -127,6 +125,10 @@ static void NIO_Selector_shutdown(struct NIO_Selector *selector)
127
125
  close(selector->wakeup_reader);
128
126
  close(selector->wakeup_writer);
129
127
 
128
+ if(selector->ev_loop) {
129
+ ev_loop_destroy(selector->ev_loop);
130
+ selector->ev_loop = 0;
131
+ }
130
132
  selector->closed = 1;
131
133
  }
132
134
 
@@ -168,7 +170,7 @@ static VALUE NIO_Selector_synchronize(VALUE self, VALUE (*func)(VALUE *args), VA
168
170
  return rb_ensure(func, (VALUE)args, NIO_Selector_unlock, self);
169
171
  } else {
170
172
  /* We already hold the selector lock, so no need to unlock it */
171
- func(args);
173
+ return func(args);
172
174
  }
173
175
  }
174
176
 
@@ -181,6 +183,8 @@ static VALUE NIO_Selector_unlock(VALUE self)
181
183
 
182
184
  lock = rb_ivar_get(self, rb_intern("lock"));
183
185
  rb_funcall(lock, rb_intern("unlock"), 0, 0);
186
+
187
+ return Qnil;
184
188
  }
185
189
 
186
190
  /* Register an IO object with the selector for the given interests */
@@ -195,11 +199,17 @@ static VALUE NIO_Selector_register_synchronized(VALUE *args)
195
199
  {
196
200
  VALUE self, io, interests, selectables, monitor;
197
201
  VALUE monitor_args[3];
202
+ struct NIO_Selector *selector;
198
203
 
199
204
  self = args[0];
200
205
  io = args[1];
201
206
  interests = args[2];
202
207
 
208
+ Data_Get_Struct(self, struct NIO_Selector, selector);
209
+ if(selector->closed) {
210
+ rb_raise(rb_eIOError, "selector is closed");
211
+ }
212
+
203
213
  selectables = rb_ivar_get(self, rb_intern("selectables"));
204
214
  monitor = rb_hash_lookup(selectables, io);
205
215
 
@@ -377,6 +387,11 @@ static VALUE NIO_Selector_wakeup(VALUE self)
377
387
 
378
388
  /* Close the selector and free system resources */
379
389
  static VALUE NIO_Selector_close(VALUE self)
390
+ {
391
+ return NIO_Selector_synchronize(self, NIO_Selector_close_synchronized, self);
392
+ }
393
+
394
+ static VALUE NIO_Selector_close_synchronized(VALUE self)
380
395
  {
381
396
  struct NIO_Selector *selector;
382
397
  Data_Get_Struct(self, struct NIO_Selector, selector);
@@ -389,7 +404,11 @@ static VALUE NIO_Selector_close(VALUE self)
389
404
  /* Is the selector closed? */
390
405
  static VALUE NIO_Selector_closed(VALUE self)
391
406
  {
392
- struct NIO_Selector *selector;
407
+ return NIO_Selector_synchronize(self, NIO_Selector_closed_synchronized, self);
408
+ }
409
+
410
+ static VALUE NIO_Selector_closed_synchronized(VALUE self)
411
+ { struct NIO_Selector *selector;
393
412
  Data_Get_Struct(self, struct NIO_Selector, selector);
394
413
 
395
414
  return selector->closed ? Qtrue : Qfalse;
@@ -399,7 +418,7 @@ static VALUE NIO_Selector_closed(VALUE self)
399
418
  static VALUE NIO_Selector_is_empty(VALUE self)
400
419
  {
401
420
  VALUE selectables = rb_ivar_get(self, rb_intern("selectables"));
402
-
421
+
403
422
  return rb_funcall(selectables, rb_intern("empty?"), 0) == Qtrue ? Qtrue : Qfalse;
404
423
  }
405
424
 
data/lib/nio/selector.rb CHANGED
@@ -18,7 +18,13 @@ module NIO
18
18
  # * :rw - is the IO either readable or writeable?
19
19
  def register(io, interest)
20
20
  @lock.synchronize do
21
- raise ArgumentError, "this IO is already registered with the selector" if @selectables[io]
21
+ if closed?
22
+ raise IOError, "selector is closed"
23
+ end
24
+
25
+ if monitor = @selectables[io]
26
+ raise ArgumentError, "this IO is already registered with the selector as #{monitor.interests.inspect}"
27
+ end
22
28
 
23
29
  monitor = Monitor.new(io, interest, self)
24
30
  @selectables[io] = monitor
@@ -54,21 +60,14 @@ module NIO
54
60
 
55
61
  ready_readers, ready_writers = Kernel.select readers, writers, [], timeout
56
62
  return unless ready_readers # timeout or wakeup
57
-
63
+
58
64
  selected_monitors = Set.new
59
65
 
60
66
  ready_readers.each do |io|
61
67
  if io == @wakeup
62
68
  # Clear all wakeup signals we've received by reading them
63
69
  # Wakeups should have level triggered behavior
64
- begin
65
- @wakeup.read_nonblock(1024)
66
-
67
- # Loop until we've drained all incoming events
68
- redo
69
- rescue Errno::EWOULDBLOCK
70
- end
71
-
70
+ @wakeup.read(@wakeup.stat.size)
72
71
  return
73
72
  else
74
73
  monitor = @selectables[io]
@@ -76,7 +75,7 @@ module NIO
76
75
  selected_monitors << monitor
77
76
  end
78
77
  end
79
-
78
+
80
79
  ready_writers.each do |io|
81
80
  monitor = @selectables[io]
82
81
  monitor.readiness = case monitor.readiness
@@ -87,7 +86,7 @@ module NIO
87
86
  end
88
87
  selected_monitors << monitor
89
88
  end
90
-
89
+
91
90
  if block_given?
92
91
  selected_monitors.each do |m|
93
92
  yield m
@@ -107,7 +106,7 @@ module NIO
107
106
  # level-triggered behavior.
108
107
  def wakeup
109
108
  # Send the selector a signal in the form of writing data to a pipe
110
- @waker << "\0"
109
+ @waker.write "\0"
111
110
  nil
112
111
  end
113
112
 
@@ -124,7 +123,7 @@ module NIO
124
123
 
125
124
  # Is this selector closed?
126
125
  def closed?; @closed end
127
-
126
+
128
127
  def empty?
129
128
  @selectables.empty?
130
129
  end
data/lib/nio/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module NIO
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
data/lib/nio.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'thread'
2
+ require 'socket'
2
3
  require 'nio/version'
3
4
 
4
5
  # New I/O for Ruby
@@ -10,7 +11,7 @@ module NIO
10
11
  def self.engine; ENGINE end
11
12
  end
12
13
 
13
- if ENV["NIO4R_PURE"]
14
+ if ENV["NIO4R_PURE"] || (ENV["OS"] =~ /Windows/i && !defined?(JRUBY_VERSION))
14
15
  require 'nio/monitor'
15
16
  require 'nio/selector'
16
17
  NIO::ENGINE = 'select'
@@ -19,9 +20,10 @@ else
19
20
 
20
21
  if defined?(JRUBY_VERSION)
21
22
  require 'java'
23
+ require 'jruby'
22
24
  org.nio4r.Nio4r.new.load(JRuby.runtime, false)
23
25
  NIO::ENGINE = 'java'
24
26
  else
25
27
  NIO::ENGINE = 'libev'
26
28
  end
27
- end
29
+ end
data/nio4r.gemspec CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
6
6
  gem.email = ["tony.arcieri@gmail.com"]
7
7
  gem.description = "New IO for Ruby"
8
8
  gem.summary = "NIO provides a high performance selector API for monitoring IO objects"
9
- gem.homepage = "https://github.com/tarcieri/nio4r"
9
+ gem.homepage = "https://github.com/celluloid/nio4r"
10
10
 
11
11
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
12
  gem.files = `git ls-files`.split("\n")
@@ -14,7 +14,13 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "nio4r"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = NIO::VERSION
17
- gem.extensions = ["ext/nio4r/extconf.rb"]
17
+
18
+ if defined? JRUBY_VERSION
19
+ gem.files << "lib/nio4r_ext.jar"
20
+ gem.platform = "java"
21
+ else
22
+ gem.extensions = ["ext/nio4r/extconf.rb"]
23
+ end
18
24
 
19
25
  gem.add_development_dependency "rake-compiler"
20
26
  gem.add_development_dependency "rake"
@@ -1,3 +1,5 @@
1
+ require 'spec_helper'
2
+
1
3
  describe "NIO acceptables" do
2
4
  shared_context "an NIO acceptable" do
3
5
  let(:selector) { NIO::Selector.new }
@@ -6,12 +6,12 @@ describe NIO::Monitor do
6
6
  let(:writer) { pipes.last }
7
7
  let(:selector) { NIO::Selector.new }
8
8
 
9
- subject { selector.register(reader, :rw) }
9
+ subject { selector.register(reader, :r) }
10
10
  let(:peer) { selector.register(writer, :rw) }
11
11
  after { selector.close }
12
12
 
13
13
  it "knows its interests" do
14
- subject.interests.should == :rw
14
+ subject.interests.should == :r
15
15
  peer.interests.should == :rw
16
16
  end
17
17