libuv 1.0.0 → 1.0.2

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
  SHA1:
3
- metadata.gz: a3fdf4a79e7b5985a3f094717f5a9c2ffe62f3df
4
- data.tar.gz: 0f89e89ea0ef13b59a164e3cdc5a108a57f5b822
3
+ metadata.gz: d13aec5db12ee41ad8e672bda901a128d7e29fd3
4
+ data.tar.gz: 554f2bd2a9ff1d9a69af2551a48a944e3af5cd91
5
5
  SHA512:
6
- metadata.gz: 3620a3921345db547e886a42fe143a38272b4d81575906e31a32ca5b984a3fb15e08239b1bf4b08a89e17c4fcc7c336b67b879616434657b38747f42c87a429b
7
- data.tar.gz: 49cce94c651ba27b4ecfbb08e443fde71527fc159c34f58fab336344b361c94ec3d02439f325c3fd748cee960a52aab7d38ccef8b6a24d271dedf532f86762d9
6
+ metadata.gz: f8362798abe6237ea412ff7ff03fbfa27a47d3606e1f8e318ae8f33555c7e23b59e8f3c84f1ab8453b08464b69cfc1fc568a5127bcc13718f02fd5fc7cb78bf6
7
+ data.tar.gz: 7f82bc4fff20b9f0a380d3bfe76b2790b5d602679f0943cbe50835bba88a5988f09c7fab31e04d2cd43bc268e2aeec8c8cbcab626ef2a3a451c3fd2e530fbc66
data/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # Libuv FFI bindings for Ruby
2
2
 
3
- [![Build Status](https://travis-ci.org/cotag/libuv.png?branch=master)](https://travis-ci.org/cotag/libuv)
3
+ [![Build Status](https://travis-ci.org/cotag/libuv.svg?branch=master)](https://travis-ci.org/cotag/libuv)
4
4
 
5
5
  [Libuv](https://github.com/joyent/libuv) is a cross platform asynchronous IO implementation that powers NodeJS. It supports sockets, both UDP and TCP, filesystem watch, TTY, Pipes and other asynchronous primitives like timer, check, prepare and idle.
6
6
 
7
- The Libuv gem contains Libuv and a Ruby wrapper that implements [pipelined promises](http://en.wikipedia.org/wiki/Futures_and_promises#Promise_pipelining) for asynchronous flow control
7
+ The Libuv gem contains Libuv and a Ruby wrapper that implements [pipelined promises](http://en.wikipedia.org/wiki/Futures_and_promises#Promise_pipelining) for asynchronous flow control and [coroutines](http://en.wikipedia.org/wiki/Coroutine) for untangling evented code
8
8
 
9
9
  ## Usage
10
10
 
11
- Create a new libuv loop or use a default one
11
+ using promises
12
12
 
13
13
  ```ruby
14
14
  require 'libuv'
@@ -21,7 +21,6 @@ Create a new libuv loop or use a default one
21
21
  timer = loop.timer do
22
22
  puts "5 seconds passed"
23
23
  timer.close
24
- loop.stop
25
24
  end
26
25
  timer.catch do |error|
27
26
  puts "error with timer: #{error}"
@@ -33,6 +32,31 @@ Create a new libuv loop or use a default one
33
32
  end
34
33
  ```
35
34
 
35
+ using coroutines (if a somewhat abstract example)
36
+
37
+ ```ruby
38
+ require 'libuv'
39
+ require 'libuv/coroutines'
40
+
41
+ loop = Libuv::Loop.default
42
+ loop.run do
43
+ begin
44
+ timer = loop.timer do
45
+ puts "5 seconds passed"
46
+ timer.close
47
+ end
48
+ timer.start(5000)
49
+
50
+ # co-routine waits for timer to close
51
+ co timer
52
+
53
+ puts "timer handle was closed"
54
+ rescue => error
55
+ puts "error with timer: #{error}"
56
+ end
57
+ end
58
+ ```
59
+
36
60
  Check out the [yard documentation](http://rubydoc.info/gems/libuv/Libuv/Loop)
37
61
 
38
62
 
@@ -69,7 +93,7 @@ Windows users will additionally require:
69
93
 
70
94
 
71
95
 
72
- ## Libuv features supported
96
+ ## Features
73
97
 
74
98
  * TCP (with TLS support)
75
99
  * UDP
@@ -87,3 +111,4 @@ Windows users will additionally require:
87
111
  * File manipulation
88
112
  * Errors (with a catch-all fallback for anything unhandled on the event loop)
89
113
  * Work queue (thread pool)
114
+ * Coroutines (optional - makes use of Fibers)
@@ -0,0 +1,46 @@
1
+ require 'fiber'
2
+
3
+ class ::Libuv::Loop
4
+ @@use_fibers = true
5
+ end
6
+
7
+ class Object
8
+ private
9
+
10
+
11
+ # Takes a Promise response and turns it into a co-routine
12
+ # for code execution without using callbacks
13
+ #
14
+ # @param *promises [::Libuv::Q::Promise] a number of promises that will be combined into a single promise
15
+ # @return [Object] Returns the result of a single promise or an array of results if provided multiple promises
16
+ # @raise [Exception] if the promise is rejected
17
+ def co(*yieldable, &block)
18
+ f = Fiber.current
19
+ wasError = false
20
+
21
+ # Convert the input into a promise
22
+ if yieldable.length == 1
23
+ promise = yieldable[0]
24
+ else
25
+ promise = ::Libuv::Loop.current.all(*yieldable)
26
+ end
27
+
28
+ # Use the promise to resume the Fiber
29
+ promise.then(proc { |res|
30
+ f.resume res
31
+ }, proc { |err|
32
+ wasError = true
33
+ f.resume err
34
+ })
35
+
36
+ # Passed independently as this is often overwritten for performance
37
+ promise.progress(block) if block_given?
38
+
39
+ # Assign the result from the resume
40
+ result = Fiber.yield
41
+
42
+ # Either return the result or raise an error
43
+ raise result if wasError
44
+ result
45
+ end
46
+ end
@@ -91,6 +91,7 @@ module Libuv
91
91
  attach_function :accept, :uv_accept, [:uv_stream_t, :uv_stream_t], :int, :blocking => true
92
92
  attach_function :read_start, :uv_read_start, [:uv_stream_t, :uv_alloc_cb, :uv_read_cb], :int, :blocking => true
93
93
  attach_function :read_stop, :uv_read_stop, [:uv_stream_t], :int, :blocking => true
94
+ attach_function :try_write, :uv_try_write, [:uv_stream_t, :pointer, :uint], :int, :blocking => true
94
95
  attach_function :write, :uv_write, [:uv_write_t, :uv_stream_t, :pointer, :uint, :uv_write_cb], :int, :blocking => true
95
96
  attach_function :write2, :uv_write2, [:uv_write_t, :uv_stream_t, :pointer, :uint, :uv_stream_t, :uv_write_cb], :int, :blocking => true
96
97
  attach_function :is_readable, :uv_is_readable, [:uv_stream_t], :int, :blocking => true
@@ -116,6 +117,7 @@ module Libuv
116
117
  attach_function :udp_set_multicast_ttl, :uv_udp_set_multicast_ttl, [:uv_udp_t, :int], :int, :blocking => true
117
118
  attach_function :udp_set_broadcast, :uv_udp_set_broadcast, [:uv_udp_t, :int], :int, :blocking => true
118
119
  attach_function :udp_set_ttl, :uv_udp_set_ttl, [:uv_udp_t, :int], :int, :blocking => true
120
+ attach_function :udp_try_send, :uv_udp_try_send, [:uv_udp_t, :pointer, :int, :sockaddr_in], :int, :blocking => true
119
121
  attach_function :udp_send, :uv_udp_send, [:uv_udp_send_t, :uv_udp_t, :pointer, :int, :sockaddr_in, :uv_udp_send_cb], :int, :blocking => true
120
122
  attach_function :udp_recv_start, :uv_udp_recv_start, [:uv_udp_t, :uv_alloc_cb, :uv_udp_recv_cb], :int, :blocking => true
121
123
  attach_function :udp_recv_stop, :uv_udp_recv_stop, [:uv_udp_t], :int, :blocking => true
@@ -7,6 +7,7 @@ module Libuv
7
7
 
8
8
  LOOPS = ThreadSafe::Cache.new
9
9
  CRITICAL = Mutex.new
10
+ @@use_fibers = false
10
11
 
11
12
 
12
13
  module ClassMethods
@@ -122,14 +123,24 @@ module Libuv
122
123
  begin
123
124
  @reactor_thread = Thread.current
124
125
  LOOPS[@reactor_thread] = @loop
125
- yield @loop_notify.promise if block_given?
126
+ if block_given?
127
+ if @@use_fibers
128
+ Fiber.new { yield @loop_notify.promise }.resume
129
+ else
130
+ yield @loop_notify.promise
131
+ end
132
+ end
126
133
  ::Libuv::Ext.run(@pointer, run_type) # This is blocking
127
134
  ensure
128
135
  @reactor_thread = nil
129
136
  @run_queue.clear
130
137
  end
131
138
  elsif block_given?
132
- schedule { yield @loop_notify.promise }
139
+ if @@use_fibers
140
+ schedule { Fiber.new { yield @loop_notify.promise }.resume }
141
+ else
142
+ schedule { yield @loop_notify.promise }
143
+ end
133
144
  end
134
145
  @loop
135
146
  end
@@ -36,6 +36,20 @@ module Libuv
36
36
  reject(error) if error
37
37
  end
38
38
 
39
+ def try_write(data)
40
+ assert_type(String, data, WRITE_ERROR)
41
+
42
+ buffer1 = ::FFI::MemoryPointer.from_string(data)
43
+ buffer = ::Libuv::Ext.buf_init(buffer1, data.respond_to?(:bytesize) ? data.bytesize : data.size)
44
+
45
+ result = ::Libuv::Ext.try_write(handle, buffer, 1)
46
+ buffer1.free
47
+
48
+ error = check_result result
49
+ raise error if error
50
+ return result
51
+ end
52
+
39
53
  def write(data)
40
54
  # NOTE:: Similar to udp.rb -> send
41
55
  deferred = @loop.defer
@@ -43,10 +57,8 @@ module Libuv
43
57
  begin
44
58
  assert_type(String, data, WRITE_ERROR)
45
59
 
46
- size = data.respond_to?(:bytesize) ? data.bytesize : data.size
47
- buffer1 = ::Libuv::Ext.malloc size
48
- buffer1.write_string data
49
- buffer = ::Libuv::Ext.buf_init(buffer1, size)
60
+ buffer1 = ::FFI::MemoryPointer.from_string(data)
61
+ buffer = ::Libuv::Ext.buf_init(buffer1, data.respond_to?(:bytesize) ? data.bytesize : data.size)
50
62
 
51
63
  # local as this variable will be available until the handle is closed
52
64
  @write_callbacks ||= {}
@@ -57,7 +69,7 @@ module Libuv
57
69
  if error
58
70
  @write_callbacks.delete req.address
59
71
  ::Libuv::Ext.free(req)
60
- ::Libuv::Ext.free(buffer1)
72
+ buffer1.free
61
73
  deferred.reject(error)
62
74
 
63
75
  reject(error) # close the handle
@@ -112,7 +124,7 @@ module Libuv
112
124
  deferred, buffer1 = @write_callbacks.delete req.address
113
125
 
114
126
  ::Libuv::Ext.free(req)
115
- ::Libuv::Ext.free(buffer1)
127
+ buffer1.free
116
128
 
117
129
  resolve deferred, status
118
130
  end
@@ -21,6 +21,10 @@ module Libuv
21
21
  return if @closed
22
22
  @stopped = false
23
23
 
24
+ # prevent timeouts less than 0 (very long time otherwise as cast to an unsigned)
25
+ # and you probably don't want to wait a few lifetimes
26
+ timeout = 0 if timeout < 0
27
+
24
28
  timeout = timeout.to_i
25
29
  repeat = repeat.to_i
26
30
 
@@ -15,6 +15,7 @@ module Libuv
15
15
 
16
16
  udp_ptr = ::Libuv::Ext.create_handle(:uv_udp)
17
17
  error = check_result(::Libuv::Ext.udp_init(loop.handle, udp_ptr))
18
+ @request_refs = {}
18
19
 
19
20
  super(udp_ptr, error)
20
21
  end
@@ -39,7 +40,7 @@ module Libuv
39
40
  return [] if @closed
40
41
  sockaddr, len = get_sockaddr_and_len
41
42
  check_result! ::Libuv::Ext.udp_getsockname(handle, sockaddr, len)
42
- get_ip_and_port(UV::Sockaddr.new(sockaddr), len.get_int(0))
43
+ get_ip_and_port(::Libuv::Ext::Sockaddr.new(sockaddr), len.get_int(0))
43
44
  end
44
45
 
45
46
  def join(multicast_address, interface_address)
@@ -76,6 +77,29 @@ module Libuv
76
77
  reject(error) if error
77
78
  end
78
79
 
80
+ def try_send(ip, port, data)
81
+ assert_type(String, ip, IP_ARGUMENT_ERROR)
82
+ assert_type(Integer, port, PORT_ARGUMENT_ERROR)
83
+ assert_type(String, data, SEND_DATA_ERROR)
84
+
85
+ sockaddr = create_sockaddr(ip, port)
86
+
87
+ buffer1 = ::FFI::MemoryPointer.from_string(data)
88
+ buffer = ::Libuv::Ext.buf_init(buffer1, data.respond_to?(:bytesize) ? data.bytesize : data.size)
89
+
90
+ result = ::Libuv::Ext.udp_try_send(
91
+ handle,
92
+ buffer,
93
+ 1,
94
+ sockaddr
95
+ )
96
+ buffer1.free
97
+
98
+ error = check_result result
99
+ raise error if error
100
+ return result
101
+ end
102
+
79
103
  def send(ip, port, data)
80
104
  # NOTE:: Similar to stream.rb -> write
81
105
  deferred = @loop.defer
@@ -87,34 +111,25 @@ module Libuv
87
111
 
88
112
  sockaddr = create_sockaddr(ip, port)
89
113
 
90
- # local as this variable will be avaliable until the handle is closed
91
- @sent_callbacks ||= []
114
+ # Save a reference to this request
115
+ req = send_req
116
+ buffer1 = ::FFI::MemoryPointer.from_string(data)
117
+ buffer = ::Libuv::Ext.buf_init(buffer1, data.respond_to?(:bytesize) ? data.bytesize : data.size)
118
+ @request_refs[req.address] = [deferred, buffer1]
92
119
 
93
- #
94
- # create the curried callback
95
- #
96
- callback = FFI::Function.new(:void, [:pointer, :int]) do |req, status|
97
- ::Libuv::Ext.free(req)
98
- # remove the callback from the array
99
- # assumes sends are done in order
100
- promise = @sent_callbacks.shift[0]
101
- resolve promise, status
102
- end
103
-
104
- #
105
120
  # Save the callback and return the promise
106
- #
107
- @sent_callbacks << [deferred, callback]
108
121
  error = check_result ::Libuv::Ext.udp_send(
109
- send_req,
122
+ req,
110
123
  handle,
111
- buf_init(data),
124
+ buffer,
112
125
  1,
113
126
  sockaddr,
114
- callback
127
+ callback(:send_complete)
115
128
  )
116
129
  if error
117
- @sent_callbacks.pop
130
+ @request_refs.delete req.address
131
+ ::Libuv::Ext.free(req)
132
+ buffer1.free
118
133
  deferred.reject(error)
119
134
  reject(error) # close the handle
120
135
  end
@@ -177,10 +192,6 @@ module Libuv
177
192
  ::Libuv::Ext.create_request(:uv_udp_send)
178
193
  end
179
194
 
180
- def buf_init(data)
181
- ::Libuv::Ext.buf_init(FFI::MemoryPointer.from_string(data), data.respond_to?(:bytesize) ? data.bytesize : data.size)
182
- end
183
-
184
195
  def create_sockaddr(ip, port)
185
196
  ips = IPAddr.new(ip)
186
197
  if ips.ipv4?
@@ -237,5 +248,14 @@ module Libuv
237
248
  @receive_size = nil
238
249
  end
239
250
  end
251
+
252
+ def send_complete(req, status)
253
+ deferred, buffer1 = @request_refs.delete req.address
254
+
255
+ ::Libuv::Ext.free(req)
256
+ buffer1.free
257
+
258
+ resolve deferred, status
259
+ end
240
260
  end
241
261
  end
@@ -1,3 +1,3 @@
1
1
  module Libuv
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.2'
3
3
  end
@@ -0,0 +1,136 @@
1
+ require 'libuv'
2
+ require 'libuv/coroutines' # adds support for coroutines
3
+
4
+
5
+ describe Object do
6
+ before :each do
7
+ @log = []
8
+ @general_failure = []
9
+
10
+ @loop = Libuv::Loop.default
11
+ @timeout = @loop.timer do
12
+ @timeout.close
13
+ @loop.stop
14
+ @general_failure << "test timed out"
15
+ end
16
+ @timeout.start(5000)
17
+ end
18
+
19
+ describe 'serial execution' do
20
+ it "should wait for work to complete and return the result" do
21
+ @loop.run { |logger|
22
+ logger.progress do |level, errorid, error|
23
+ begin
24
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n") if error.backtrace}\n"
25
+ rescue Exception => e
26
+ @general_failure << "error in logger #{e.inspect}"
27
+ end
28
+ end
29
+
30
+
31
+ @log << co(@loop.work(proc {
32
+ sleep 1
33
+ 'work done'
34
+ }))
35
+ @log << 'after work'
36
+
37
+ @timeout.close
38
+ @loop.stop
39
+ }
40
+
41
+ expect(@general_failure).to eq([])
42
+ expect(@log).to eq(['work done', 'after work'])
43
+ end
44
+
45
+ it "should raise an error if the promise is rejected" do
46
+ @loop.run { |logger|
47
+ logger.progress do |level, errorid, error|
48
+ begin
49
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n") if error.backtrace}\n"
50
+ rescue Exception => e
51
+ @general_failure << "error in logger #{e.inspect}"
52
+ end
53
+ end
54
+
55
+ begin
56
+ @log << co(@loop.work(proc {
57
+ raise 'rejected'
58
+ }))
59
+ @log << 'after work'
60
+ rescue => e
61
+ @log << e.message
62
+ end
63
+
64
+ @timeout.close
65
+ @loop.stop
66
+ }
67
+
68
+ expect(@general_failure).to eq([])
69
+ expect(@log).to eq(['rejected'])
70
+ end
71
+
72
+ it "should return the results of multiple promises" do
73
+ @loop.run { |logger|
74
+ logger.progress do |level, errorid, error|
75
+ begin
76
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n") if error.backtrace}\n"
77
+ rescue Exception => e
78
+ @general_failure << "error in logger #{e.inspect}"
79
+ end
80
+ end
81
+
82
+
83
+ job1 = @loop.work(proc {
84
+ sleep 1
85
+ 'job1'
86
+ })
87
+
88
+ job2 = @loop.work(proc {
89
+ sleep 1
90
+ 'job2'
91
+ })
92
+
93
+ # Job1 and Job2 are executed in parallel
94
+ result1, result2 = co(job1, job2)
95
+
96
+ @log << result1
97
+ @log << result2
98
+ @log << 'after work'
99
+
100
+ @timeout.close
101
+ @loop.stop
102
+ }
103
+
104
+ expect(@general_failure).to eq([])
105
+ expect(@log).to eq(['job1', 'job2', 'after work'])
106
+ end
107
+
108
+
109
+ it "should provide a callback option for progress events" do
110
+ @loop.run { |logger|
111
+ logger.progress do |level, errorid, error|
112
+ begin
113
+ @general_failure << "Log called: #{level}: #{errorid}\n#{error.message}\n#{error.backtrace.join("\n") if error.backtrace}\n"
114
+ rescue Exception => e
115
+ @general_failure << "error in logger #{e.inspect}"
116
+ end
117
+ end
118
+
119
+ timer = @loop.timer
120
+ timer.start(0)
121
+ co(timer) do
122
+ @log << 'in timer'
123
+ timer.close # close will resolve the promise
124
+ end
125
+
126
+ @log << 'after timer'
127
+
128
+ @timeout.close
129
+ @loop.stop
130
+ }
131
+
132
+ expect(@log).to eq(['in timer', 'after timer'])
133
+ expect(@general_failure).to eq([])
134
+ end
135
+ end
136
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libuv
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bulat Shakirzyanov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-20 00:00:00.000000000 Z
12
+ date: 2014-08-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -117,6 +117,7 @@ files:
117
117
  - lib/libuv.rb
118
118
  - lib/libuv/async.rb
119
119
  - lib/libuv/check.rb
120
+ - lib/libuv/coroutines.rb
120
121
  - lib/libuv/dns.rb
121
122
  - lib/libuv/error.rb
122
123
  - lib/libuv/ext/ext.rb
@@ -153,6 +154,7 @@ files:
153
154
  - lib/libuv/work.rb
154
155
  - libuv.gemspec
155
156
  - spec/async_spec.rb
157
+ - spec/coroutines_spec.rb
156
158
  - spec/cpu_spec.rb
157
159
  - spec/defer_spec.rb
158
160
  - spec/dns_spec.rb
@@ -175,15 +177,19 @@ files:
175
177
  - ext/libuv/common.gypi
176
178
  - ext/libuv/configure.ac
177
179
  - ext/libuv/gyp_uv.py
180
+ - ext/libuv/img/banner.png
181
+ - ext/libuv/img/logos.svg
178
182
  - ext/libuv/include/android-ifaddrs.h
179
183
  - ext/libuv/include/pthread-fixes.h
180
184
  - ext/libuv/include/stdint-msvc2008.h
181
185
  - ext/libuv/include/tree.h
186
+ - ext/libuv/include/uv-aix.h
182
187
  - ext/libuv/include/uv-bsd.h
183
188
  - ext/libuv/include/uv-darwin.h
184
189
  - ext/libuv/include/uv-errno.h
185
190
  - ext/libuv/include/uv-linux.h
186
191
  - ext/libuv/include/uv-sunos.h
192
+ - ext/libuv/include/uv-threadpool.h
187
193
  - ext/libuv/include/uv-unix.h
188
194
  - ext/libuv/include/uv-version.h
189
195
  - ext/libuv/include/uv-win.h
@@ -209,6 +215,7 @@ files:
209
215
  - ext/libuv/src/heap-inl.h
210
216
  - ext/libuv/src/inet.c
211
217
  - ext/libuv/src/queue.h
218
+ - ext/libuv/src/threadpool.c
212
219
  - ext/libuv/src/unix/aix.c
213
220
  - ext/libuv/src/unix/android-ifaddrs.c
214
221
  - ext/libuv/src/unix/async.c
@@ -221,6 +228,7 @@ files:
221
228
  - ext/libuv/src/unix/fs.c
222
229
  - ext/libuv/src/unix/fsevents.c
223
230
  - ext/libuv/src/unix/getaddrinfo.c
231
+ - ext/libuv/src/unix/getnameinfo.c
224
232
  - ext/libuv/src/unix/internal.h
225
233
  - ext/libuv/src/unix/kqueue.c
226
234
  - ext/libuv/src/unix/linux-core.c
@@ -242,7 +250,6 @@ files:
242
250
  - ext/libuv/src/unix/sunos.c
243
251
  - ext/libuv/src/unix/tcp.c
244
252
  - ext/libuv/src/unix/thread.c
245
- - ext/libuv/src/unix/threadpool.c
246
253
  - ext/libuv/src/unix/timer.c
247
254
  - ext/libuv/src/unix/tty.c
248
255
  - ext/libuv/src/unix/udp.c
@@ -258,6 +265,7 @@ files:
258
265
  - ext/libuv/src/win/fs-event.c
259
266
  - ext/libuv/src/win/fs.c
260
267
  - ext/libuv/src/win/getaddrinfo.c
268
+ - ext/libuv/src/win/getnameinfo.c
261
269
  - ext/libuv/src/win/handle-inl.h
262
270
  - ext/libuv/src/win/handle.c
263
271
  - ext/libuv/src/win/internal.h
@@ -273,7 +281,6 @@ files:
273
281
  - ext/libuv/src/win/stream.c
274
282
  - ext/libuv/src/win/tcp.c
275
283
  - ext/libuv/src/win/thread.c
276
- - ext/libuv/src/win/threadpool.c
277
284
  - ext/libuv/src/win/timer.c
278
285
  - ext/libuv/src/win/tty.c
279
286
  - ext/libuv/src/win/udp.c
@@ -337,6 +344,7 @@ files:
337
344
  - ext/libuv/test/test-get-loadavg.c
338
345
  - ext/libuv/test/test-get-memory.c
339
346
  - ext/libuv/test/test-getaddrinfo.c
347
+ - ext/libuv/test/test-getnameinfo.c
340
348
  - ext/libuv/test/test-getsockname.c
341
349
  - ext/libuv/test/test-hrtime.c
342
350
  - ext/libuv/test/test-idle.c
@@ -362,6 +370,7 @@ files:
362
370
  - ext/libuv/test/test-pipe-server-close.c
363
371
  - ext/libuv/test/test-platform-output.c
364
372
  - ext/libuv/test/test-poll-close.c
373
+ - ext/libuv/test/test-poll-closesocket.c
365
374
  - ext/libuv/test/test-poll.c
366
375
  - ext/libuv/test/test-process-title.c
367
376
  - ext/libuv/test/test-ref.c
@@ -390,6 +399,7 @@ files:
390
399
  - ext/libuv/test/test-tcp-shutdown-after-write.c
391
400
  - ext/libuv/test/test-tcp-try-write.c
392
401
  - ext/libuv/test/test-tcp-unexpected-read.c
402
+ - ext/libuv/test/test-tcp-write-queue-order.c
393
403
  - ext/libuv/test/test-tcp-write-to-half-open-connection.c
394
404
  - ext/libuv/test/test-tcp-writealot.c
395
405
  - ext/libuv/test/test-thread.c
@@ -410,6 +420,8 @@ files:
410
420
  - ext/libuv/test/test-udp-open.c
411
421
  - ext/libuv/test/test-udp-options.c
412
422
  - ext/libuv/test/test-udp-send-and-recv.c
423
+ - ext/libuv/test/test-udp-send-immediate.c
424
+ - ext/libuv/test/test-udp-try-send.c
413
425
  - ext/libuv/test/test-walk-handles.c
414
426
  - ext/libuv/test/test-watcher-cross-stop.c
415
427
  - ext/libuv/uv.gyp
@@ -440,6 +452,7 @@ specification_version: 4
440
452
  summary: libuv bindings for Ruby
441
453
  test_files:
442
454
  - spec/async_spec.rb
455
+ - spec/coroutines_spec.rb
443
456
  - spec/cpu_spec.rb
444
457
  - spec/defer_spec.rb
445
458
  - spec/dns_spec.rb