uvrb 0.1.4 → 0.2.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/lib/uv.rb CHANGED
@@ -81,7 +81,7 @@ module UV
81
81
  attach_function :shutdown, :uv_shutdown, [:uv_shutdown_t, :uv_stream_t, :uv_shutdown_cb], :int, :blocking => true
82
82
 
83
83
  attach_function :tcp_init, :uv_tcp_init, [:uv_loop_t, :uv_tcp_t], :int, :blocking => true
84
- #attach_function :tcp_open, :uv_tcp_open, [:uv_tcp_t, :uv_os_sock_t], :int
84
+ attach_function :tcp_open, :uv_tcp_open, [:uv_tcp_t, :uv_os_sock_t], :int, :blocking => true
85
85
  attach_function :tcp_nodelay, :uv_tcp_nodelay, [:uv_tcp_t, :int], :int, :blocking => true
86
86
  attach_function :tcp_keepalive, :uv_tcp_keepalive, [:uv_tcp_t, :int, :uint], :int, :blocking => true
87
87
  attach_function :tcp_simultaneous_accepts, :uv_tcp_simultaneous_accepts, [:uv_tcp_t, :int], :int, :blocking => true
@@ -93,6 +93,7 @@ module UV
93
93
  attach_function :tcp_connect6, :uv_tcp_connect6, [:uv_connect_t, :uv_tcp_t, :sockaddr_in6, :uv_connect_cb], :int, :blocking => true
94
94
 
95
95
  attach_function :udp_init, :uv_udp_init, [:uv_loop_t, :uv_udp_t], :int, :blocking => true
96
+ attach_function :udp_open, :uv_udp_open, [:uv_udp_t, :uv_os_sock_t], :int, :blocking => true
96
97
  attach_function :udp_bind, :uv_udp_bind, [:uv_udp_t, :sockaddr_in, :uint], :int, :blocking => true
97
98
  attach_function :udp_bind6, :uv_udp_bind6, [:uv_udp_t, :sockaddr_in6, :uint], :int, :blocking => true
98
99
  attach_function :udp_getsockname, :uv_udp_getsockname, [:uv_udp_t, :pointer, :pointer], :int, :blocking => true
@@ -141,6 +142,10 @@ module UV
141
142
  attach_function :timer_set_repeat, :uv_timer_set_repeat, [:uv_timer_t, :int64_t], :void, :blocking => true
142
143
  attach_function :timer_get_repeat, :uv_timer_get_repeat, [:uv_timer_t], :int64_t, :blocking => true
143
144
 
145
+ attach_function :signal_init, :uv_signal_init, [:uv_loop_t, :uv_signal_t], :int, :blocking => true
146
+ attach_function :signal_start, :uv_signal_start, [:uv_signal_t, :uv_signal_cb, :int], :int, :blocking => true
147
+ attach_function :signal_stop, :uv_signal_stop, [:uv_signal_t], :int, :blocking => true
148
+
144
149
  #attach_function :ares_init_options, :uv_ares_init_options, [:uv_loop_t, :ares_channel, :ares_options, :int], :int
145
150
  #attach_function :ares_destroy, :uv_ares_destroy, [:uv_loop_t, :ares_channel], :void
146
151
 
@@ -239,9 +244,6 @@ module UV
239
244
  attach_function :handle_size, :uv_handle_size, [:uv_handle_type], :size_t, :blocking => true
240
245
  attach_function :req_size, :uv_req_size, [:uv_req_type], :size_t, :blocking => true
241
246
 
242
- # This function is attached differently in windows - see ./types/windows.rb
243
- attach_function :ntohs, [:ushort], :ushort, :blocking => true unless FFI::Platform.windows?
244
-
245
247
 
246
248
  def self.create_handle(type)
247
249
  LIBC.malloc(UV.handle_size(type))
@@ -268,6 +270,7 @@ module UV
268
270
  autoload :Idle, 'uv/idle'
269
271
  autoload :Async, 'uv/async'
270
272
  autoload :Work, 'uv/work'
273
+ autoload :Signal, 'uv/signal'
271
274
  autoload :Filesystem, 'uv/filesystem'
272
275
  autoload :File, 'uv/file'
273
276
  autoload :FSEvent, 'uv/fs_event'
@@ -26,5 +26,12 @@ module UV
26
26
  raise ArgumentError, msg, caller
27
27
  end
28
28
  end
29
+
30
+ def assert_signal(signo, msg = nil)
31
+ if not ::Signal.list.values.include?(signo)
32
+ msg ||= "undefined signal number: #{signo}"
33
+ raise ArgumentError, msg, caller
34
+ end
35
+ end
29
36
  end
30
37
  end
@@ -2,8 +2,16 @@ module UV
2
2
  module Handle
3
3
  include Assertions, Resource, Listener
4
4
 
5
+ class << self
6
+ def close(handle)
7
+ proc { UV.close(handle, UV.method(:free)) }
8
+ end
9
+ end
10
+
5
11
  def initialize(loop, pointer)
6
12
  @loop, @pointer = loop, pointer
13
+
14
+ ObjectSpace.define_finalizer(self, Handle.close(@pointer))
7
15
  end
8
16
 
9
17
  # Public: Increment internal ref counter for the handle on the loop. Useful for
@@ -27,7 +35,11 @@ module UV
27
35
  end
28
36
 
29
37
  def close(&block)
30
- if not block.nil?
38
+ return if @pointer.nil?
39
+
40
+ ObjectSpace.undefine_finalizer(self)
41
+
42
+ if block
31
43
  assert_block(block)
32
44
  assert_arity(0, block)
33
45
 
@@ -61,8 +73,10 @@ module UV
61
73
  def on_close(pointer)
62
74
  UV.free(pointer)
63
75
  clear_callbacks
64
-
76
+
65
77
  @close_block.call unless @close_block.nil?
78
+
79
+ @pointer = nil
66
80
  end
67
81
  end
68
82
  end
@@ -20,6 +20,7 @@ module UV
20
20
  end
21
21
 
22
22
  private
23
+
23
24
  def on_idle(handle, status)
24
25
  @idle_block.call(check_result(status))
25
26
  end
@@ -2,25 +2,27 @@ require 'set'
2
2
 
3
3
  module UV
4
4
  module Listener
5
- private
6
- def callbacks
7
- @callbacks ||= Set.new
5
+ @@callbacks = Hash.new { |hash, object_id| hash[object_id] = Hash.new }
6
+
7
+ class << self
8
+ def define_callback(object_id, name, callback)
9
+ @@callbacks[object_id][name] ||= callback
10
+ end
11
+
12
+ def undefine_callbacks(object_id)
13
+ @@callbacks.delete(object_id)
14
+ nil
15
+ end
8
16
  end
9
17
 
18
+ private
19
+
10
20
  def callback(name)
11
- const_name = "#{name.upcase}_#{object_id}"
12
- unless self.class.const_defined?(const_name)
13
- callbacks << const_name
14
- self.class.const_set(const_name, method(name))
15
- end
16
- self.class.const_get(const_name)
21
+ Listener.define_callback(object_id, name, method(name))
17
22
  end
18
23
 
19
24
  def clear_callbacks
20
- callbacks.each do |name|
21
- self.class.send(:remove_const, name)
22
- end
23
- callbacks.clear
25
+ Listener.undefine_callbacks(object_id)
24
26
  end
25
27
  end
26
28
  end
@@ -105,6 +105,10 @@ module UV
105
105
  run(:UV_RUN_ONCE)
106
106
  end
107
107
 
108
+ def stop
109
+ check_result! UV.stop(@pointer)
110
+ end
111
+
108
112
  # Public: forces loop time update, useful for getting more granular times
109
113
  #
110
114
  # Returns nothing
@@ -280,6 +284,16 @@ module UV
280
284
  fs_event
281
285
  end
282
286
 
287
+ # Public: Get a new Signal handle
288
+ #
289
+ # Returns UV::Signal
290
+ def signal
291
+ signal_ptr = UV.create_handle(:uv_signal)
292
+
293
+ check_result! UV.signal_init(@pointer, signal_ptr)
294
+ Signal.new(self, signal_ptr)
295
+ end
296
+
283
297
  # Internal: Get a hold of internal loop pointer instance
284
298
  #
285
299
  # Returns FFI::Pointer
@@ -1,7 +1,7 @@
1
1
  module UV
2
2
  module Resource
3
3
  def check_result(rc)
4
- @loop.lookup_error(rc) unless rc.nil? || rc >= 0
4
+ @loop.lookup_error(rc) if rc && rc < 0
5
5
  end
6
6
 
7
7
  def check_result!(rc)
@@ -0,0 +1,29 @@
1
+ module UV
2
+ class Signal
3
+ include Assertions, Handle
4
+
5
+ def start(signum, &block)
6
+ assert_signal(signum)
7
+ assert_block(block)
8
+ assert_arity(1, block)
9
+
10
+ @signal_block = block
11
+
12
+ check_result! UV.signal_start(handle, callback(:on_signal), signum)
13
+
14
+ self
15
+ end
16
+
17
+ def stop
18
+ check_result! UV.signal_stop(handle)
19
+
20
+ self
21
+ end
22
+
23
+ private
24
+
25
+ def on_signal(handle, status)
26
+ @signal_block.call(check_result(status))
27
+ end
28
+ end
29
+ end
@@ -4,6 +4,12 @@ module UV
4
4
  class TCP
5
5
  include Stream, Net
6
6
 
7
+ def open(fd)
8
+ check_result! UV.tcp_open(handle, fd)
9
+
10
+ self
11
+ end
12
+
7
13
  def bind(ip, port)
8
14
  assert_type(String, ip, "ip must be a String")
9
15
  assert_type(Integer, port, "port must be an Integer")
@@ -181,6 +181,7 @@ module UV
181
181
  typedef :pointer, :uv_write_t
182
182
  typedef :pointer, :uv_connect_t
183
183
  typedef :pointer, :uv_udp_send_t
184
+ typedef :pointer, :uv_signal_t
184
185
  typedef :int, :uv_file
185
186
  typedef :pointer, :ares_channel
186
187
  typedef :pointer, :ares_options
@@ -213,6 +214,7 @@ module UV
213
214
  callback :uv_prepare_cb, [:uv_prepare_t, :status], :void
214
215
  callback :uv_check_cb, [:uv_check_t, :status], :void
215
216
  callback :uv_idle_cb, [:uv_idle_t, :status], :void
217
+ callback :uv_signal_cb, [:uv_signal_t, :status], :void
216
218
  callback :uv_getaddrinfo_cb, [:uv_getaddrinfo_t, :status, :addrinfo], :void
217
219
  callback :uv_exit_cb, [:uv_process_t, :int, :int], :void
218
220
  callback :uv_walk_cb, [:uv_handle_t, :pointer], :void
@@ -1,4 +1,6 @@
1
1
  module UV
2
+ typedef :int, :uv_os_sock_t
3
+
2
4
  class UvBuf < FFI::Struct
3
5
  layout :base, :pointer, :len, :size_t
4
6
  end
@@ -9,4 +11,6 @@ module UV
9
11
  :st_blksize, :blksize_t, :st_blocks, :blkcnt_t, :st_atime, :time_t,
10
12
  :st_mtime, :time_t, :st_ctime, :time_t
11
13
  end
14
+
15
+ attach_function :ntohs, [:ushort], :ushort, :blocking => true
12
16
  end
@@ -2,6 +2,8 @@ module UV
2
2
  typedef :uint32_t, :in_addr_t
3
3
  typedef :uint16, :in_port_t
4
4
  typedef :int, :mode_t
5
+ # http://stackoverflow.com/questions/1953639/is-it-safe-to-cast-socket-to-int-under-win64
6
+ typedef :int, :uv_os_sock_t
5
7
 
6
8
  module WS2
7
9
  extend FFI::Library
@@ -2,6 +2,12 @@ module UV
2
2
  class UDP
3
3
  include Handle, Net
4
4
 
5
+ def open(fd)
6
+ check_result! UV.udp_open(handle, fd)
7
+
8
+ self
9
+ end
10
+
5
11
  def bind(ip, port, ipv6_only = false)
6
12
  assert_type(String, ip, "ip must be a String")
7
13
  assert_type(Integer, port, "port must be an Integer")
@@ -1,3 +1,3 @@
1
1
  module UV
2
- VERSION = '0.1.4'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -32,6 +32,14 @@ describe UV::Loop do
32
32
  end
33
33
  end
34
34
 
35
+ describe "#stop" do
36
+ it "calls UV.stop" do
37
+ UV.should_receive(:stop).with(loop_pointer)
38
+
39
+ subject.stop
40
+ end
41
+ end
42
+
35
43
  describe "#update_time" do
36
44
  it "calls UV.update_time" do
37
45
  UV.should_receive(:update_time).with(loop_pointer)
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe UV::Signal do
4
+ let(:handle_name) { :signal }
5
+ let(:loop) { double() }
6
+ let(:pointer) { double() }
7
+ subject { UV::Signal.new(loop, pointer) }
8
+
9
+ it_behaves_like 'a handle'
10
+
11
+ describe "#start" do
12
+ let(:signo) { 2 }
13
+
14
+ it "requires a block" do
15
+ expect { subject.start(signo) }.to raise_error(ArgumentError)
16
+ end
17
+
18
+ it "calls UV.signal_start" do
19
+ UV.should_receive(:signal_start).with(pointer, subject.method(:on_signal), signo)
20
+
21
+ subject.start(signo) { |e| }
22
+ end
23
+ end
24
+
25
+ describe "#stop" do
26
+ it "calls UV.signal_stop" do
27
+ UV.should_receive(:signal_stop).with(pointer)
28
+
29
+ subject.stop
30
+ end
31
+ end
32
+ end
@@ -9,6 +9,16 @@ describe UV::TCP do
9
9
  it_behaves_like 'a handle'
10
10
  it_behaves_like 'a stream'
11
11
 
12
+ describe "#open" do
13
+ let(:fd) { 4 }
14
+
15
+ it "calls UV.tcp_open" do
16
+ UV.should_receive(:tcp_open).with(pointer, fd)
17
+
18
+ subject.open(fd)
19
+ end
20
+ end
21
+
12
22
  describe "#bind" do
13
23
  let(:ip_addr) { double() }
14
24
  let(:port) { 0 }
@@ -8,6 +8,16 @@ describe UV::UDP do
8
8
 
9
9
  it_behaves_like 'a handle'
10
10
 
11
+ describe "#open" do
12
+ let(:fd) { 4 }
13
+
14
+ it "calls UV.udp_open" do
15
+ UV.should_receive(:udp_open).with(pointer, fd)
16
+
17
+ subject.open(fd)
18
+ end
19
+ end
20
+
11
21
  describe "#bind" do
12
22
  let(:ip_addr) { double() }
13
23
  let(:port) { 0 }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uvrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-13 00:00:00.000000000 Z
12
+ date: 2013-12-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -160,6 +160,7 @@ files:
160
160
  - lib/uv/pipe.rb
161
161
  - lib/uv/prepare.rb
162
162
  - lib/uv/resource.rb
163
+ - lib/uv/signal.rb
163
164
  - lib/uv/stream.rb
164
165
  - lib/uv/tasks.rb
165
166
  - lib/uv/tasks/mac.rb
@@ -189,6 +190,7 @@ files:
189
190
  - spec/uv/loop_spec.rb
190
191
  - spec/uv/pipe_spec.rb
191
192
  - spec/uv/prepare_spec.rb
193
+ - spec/uv/signal_spec.rb
192
194
  - spec/uv/tcp_spec.rb
193
195
  - spec/uv/timer_spec.rb
194
196
  - spec/uv/tty_spec.rb
@@ -199,34 +201,37 @@ files:
199
201
  - ext/libuv/AUTHORS
200
202
  - ext/libuv/ChangeLog
201
203
  - ext/libuv/LICENSE
202
- - ext/libuv/Makefile
204
+ - ext/libuv/Makefile.am
205
+ - ext/libuv/Makefile.mingw
203
206
  - ext/libuv/README.md
204
- - ext/libuv/build.mk
207
+ - ext/libuv/android-configure
208
+ - ext/libuv/autogen.sh
205
209
  - ext/libuv/checksparse.sh
206
210
  - ext/libuv/common.gypi
207
- - ext/libuv/config-mingw.mk
208
- - ext/libuv/config-unix.mk
211
+ - ext/libuv/configure.ac
209
212
  - ext/libuv/gyp_uv
210
- - ext/libuv/include/uv-private/ngx-queue.h
211
- - ext/libuv/include/uv-private/stdint-msvc2008.h
212
- - ext/libuv/include/uv-private/tree.h
213
- - ext/libuv/include/uv-private/uv-bsd.h
214
- - ext/libuv/include/uv-private/uv-darwin.h
215
- - ext/libuv/include/uv-private/uv-linux.h
216
- - ext/libuv/include/uv-private/uv-sunos.h
217
- - ext/libuv/include/uv-private/uv-unix.h
218
- - ext/libuv/include/uv-private/uv-win.h
213
+ - ext/libuv/include/pthread-fixes.h
214
+ - ext/libuv/include/stdint-msvc2008.h
215
+ - ext/libuv/include/tree.h
216
+ - ext/libuv/include/uv-bsd.h
217
+ - ext/libuv/include/uv-darwin.h
218
+ - ext/libuv/include/uv-errno.h
219
+ - ext/libuv/include/uv-linux.h
220
+ - ext/libuv/include/uv-sunos.h
221
+ - ext/libuv/include/uv-unix.h
222
+ - ext/libuv/include/uv-win.h
219
223
  - ext/libuv/include/uv.h
224
+ - ext/libuv/m4/.gitignore
225
+ - ext/libuv/m4/dtrace.m4
220
226
  - ext/libuv/src/fs-poll.c
221
227
  - ext/libuv/src/inet.c
228
+ - ext/libuv/src/queue.h
222
229
  - ext/libuv/src/unix/aix.c
223
230
  - ext/libuv/src/unix/async.c
224
231
  - ext/libuv/src/unix/core.c
225
- - ext/libuv/src/unix/cygwin.c
226
232
  - ext/libuv/src/unix/darwin-proctitle.c
227
233
  - ext/libuv/src/unix/darwin.c
228
234
  - ext/libuv/src/unix/dl.c
229
- - ext/libuv/src/unix/error.c
230
235
  - ext/libuv/src/unix/freebsd.c
231
236
  - ext/libuv/src/unix/fs.c
232
237
  - ext/libuv/src/unix/fsevents.c
@@ -245,6 +250,7 @@ files:
245
250
  - ext/libuv/src/unix/poll.c
246
251
  - ext/libuv/src/unix/process.c
247
252
  - ext/libuv/src/unix/proctitle.c
253
+ - ext/libuv/src/unix/pthread-fixes.c
248
254
  - ext/libuv/src/unix/signal.c
249
255
  - ext/libuv/src/unix/stream.c
250
256
  - ext/libuv/src/unix/sunos.c
@@ -322,6 +328,7 @@ files:
322
328
  - ext/libuv/test/runner.h
323
329
  - ext/libuv/test/task.h
324
330
  - ext/libuv/test/test-active.c
331
+ - ext/libuv/test/test-async-null-cb.c
325
332
  - ext/libuv/test/test-async.c
326
333
  - ext/libuv/test/test-barrier.c
327
334
  - ext/libuv/test/test-callback-order.c
@@ -344,6 +351,7 @@ files:
344
351
  - ext/libuv/test/test-getsockname.c
345
352
  - ext/libuv/test/test-hrtime.c
346
353
  - ext/libuv/test/test-idle.c
354
+ - ext/libuv/test/test-ip6-addr.c
347
355
  - ext/libuv/test/test-ipc-send-recv.c
348
356
  - ext/libuv/test/test-ipc.c
349
357
  - ext/libuv/test/test-list.h
@@ -424,7 +432,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
424
432
  version: '0'
425
433
  segments:
426
434
  - 0
427
- hash: 1737719522335393934
435
+ hash: 3415186922912615671
428
436
  requirements:
429
437
  - libuv
430
438
  rubyforge_project:
@@ -451,6 +459,7 @@ test_files:
451
459
  - spec/uv/loop_spec.rb
452
460
  - spec/uv/pipe_spec.rb
453
461
  - spec/uv/prepare_spec.rb
462
+ - spec/uv/signal_spec.rb
454
463
  - spec/uv/tcp_spec.rb
455
464
  - spec/uv/timer_spec.rb
456
465
  - spec/uv/tty_spec.rb