libuv 1.0.0 → 1.0.2

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.
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