libuv 3.1.9 → 3.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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/README.md +9 -0
- data/lib/libuv.rb +4 -2
- data/lib/libuv/async.rb +2 -2
- data/lib/libuv/check.rb +2 -2
- data/lib/libuv/dns.rb +2 -2
- data/lib/libuv/error.rb +6 -0
- data/lib/libuv/ext/ext.rb +1 -1
- data/lib/libuv/ext/types.rb +41 -1
- data/lib/libuv/fiber_pool.rb +79 -0
- data/lib/libuv/file.rb +10 -10
- data/lib/libuv/filesystem.rb +11 -11
- data/lib/libuv/fs_event.rb +1 -1
- data/lib/libuv/handle.rb +2 -2
- data/lib/libuv/idle.rb +2 -2
- data/lib/libuv/mixins/fs_checks.rb +3 -3
- data/lib/libuv/mixins/stream.rb +9 -9
- data/lib/libuv/pipe.rb +6 -6
- data/lib/libuv/prepare.rb +2 -2
- data/lib/libuv/reactor.rb +11 -13
- data/lib/libuv/signal.rb +2 -2
- data/lib/libuv/spawn.rb +113 -0
- data/lib/libuv/tcp.rb +8 -6
- data/lib/libuv/timer.rb +2 -2
- data/lib/libuv/udp.rb +6 -6
- data/lib/libuv/version.rb +1 -1
- data/lib/libuv/work.rb +3 -3
- data/spec/idle_spec.rb +1 -1
- data/spec/spawn_spec.rb +119 -0
- data/spec/test.sh +4 -0
- data/spec/test_fail.sh +3 -0
- data/spec/test_read.sh +3 -0
- metadata +15 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd16f081b56087f5fc6c17dcea3cfaa2aeca8968
|
4
|
+
data.tar.gz: 6d22b971ef7eee595abd656a0d53e80080de0130
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7928432c64a8b4182ef95d17979cfe81c6bed6f1a2113fed5e048f97c823badd7cbf79c437d69ad65389b0a87107dcbfa973833db6a3fbc707ef6caaf4a7c908
|
7
|
+
data.tar.gz: 746acbece27866330a475d6fb9dfff6fa2604291cc053c87a4fd3c1f4ef073c1034c46ccf2e28d632738c16088ae1061377f474b47da7c9c3744ed739d711750
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -178,3 +178,12 @@ server.remove_host('somehost2.com')
|
|
178
178
|
|
179
179
|
You don't have to specify any hosts at binding time.
|
180
180
|
|
181
|
+
|
182
|
+
## Protocols and 3rd party plugins
|
183
|
+
|
184
|
+
* [HTTP](https://github.com/cotag/uv-rays - with SNI [server name indication] support)
|
185
|
+
* [Faraday plugin](https://github.com/cotag/uv-rays/blob/master/lib/faraday/adapter/libuv.rb)
|
186
|
+
* [HTTPI plugin](https://github.com/cotag/uv-rays/blob/master/lib/httpi/adapter/libuv.rb)
|
187
|
+
* [HTTP2](https://github.com/igrigorik/http-2)
|
188
|
+
* [SOAP](https://github.com/savonrb/savon) (using HTTPI plugin)
|
189
|
+
* [SNMP](https://github.com/acaprojects/ruby-engine/blob/master/lib/protocols/snmp.rb)
|
data/lib/libuv.rb
CHANGED
@@ -21,8 +21,9 @@ module Libuv
|
|
21
21
|
require 'libuv/prepare' # Called at the end of a reactor cycle
|
22
22
|
require 'libuv/async' # Provide a threadsafe way to signal the event reactor
|
23
23
|
require 'libuv/timer' # High resolution timer
|
24
|
-
require 'libuv/reactor'
|
25
|
-
require 'libuv/coroutines'
|
24
|
+
require 'libuv/reactor' # The libuv reactor or event reactor
|
25
|
+
require 'libuv/coroutines' # Pause program execution until a result is returned
|
26
|
+
require 'libuv/fiber_pool' # Fibers on jRuby and Rubinius are threads and expensive to re-create
|
26
27
|
# --
|
27
28
|
|
28
29
|
autoload :FsChecks, 'libuv/mixins/fs_checks' # Common code to check file system results
|
@@ -32,6 +33,7 @@ module Libuv
|
|
32
33
|
autoload :Filesystem, 'libuv/filesystem' # Async directory manipulation
|
33
34
|
autoload :FSEvent, 'libuv/fs_event' # Notifies of changes to files and folders as they occur
|
34
35
|
autoload :Signal, 'libuv/signal' # Used to handle OS signals
|
36
|
+
autoload :Spawn, 'libuv/spawn' # Executes a child process
|
35
37
|
autoload :Check, 'libuv/check' # Called before processing events on the reactor
|
36
38
|
autoload :File, 'libuv/file' # Async file reading and writing
|
37
39
|
autoload :Idle, 'libuv/idle' # Called when there are no events to process
|
data/lib/libuv/async.rb
CHANGED
data/lib/libuv/check.rb
CHANGED
data/lib/libuv/dns.rb
CHANGED
@@ -72,7 +72,7 @@ module Libuv
|
|
72
72
|
|
73
73
|
e = check_result(status)
|
74
74
|
|
75
|
-
|
75
|
+
@reactor.exec do
|
76
76
|
if e
|
77
77
|
@defer.reject(e)
|
78
78
|
else
|
@@ -89,7 +89,7 @@ module Libuv
|
|
89
89
|
end
|
90
90
|
::Libuv::Ext.freeaddrinfo(addrinfo)
|
91
91
|
end
|
92
|
-
|
92
|
+
end
|
93
93
|
|
94
94
|
# Clean up references
|
95
95
|
cleanup_callbacks
|
data/lib/libuv/error.rb
CHANGED
@@ -78,5 +78,11 @@ module Libuv
|
|
78
78
|
class ENXIO < Error; end
|
79
79
|
class EMLINK < Error; end
|
80
80
|
class EHOSTDOWN < Error; end
|
81
|
+
class EREMOTEIO < Error; end
|
82
|
+
|
83
|
+
# Non-zero exit code
|
84
|
+
class ProcessExitCode < Error
|
85
|
+
attr_accessor :exit_status, :term_signal
|
86
|
+
end
|
81
87
|
end
|
82
88
|
end
|
data/lib/libuv/ext/ext.rb
CHANGED
@@ -209,7 +209,7 @@ module Libuv
|
|
209
209
|
attach_function :getaddrinfo, :uv_getaddrinfo, [:uv_loop_t, :uv_getaddrinfo_t, :uv_getaddrinfo_cb, :string, :string, UvAddrinfo.by_ref], :int
|
210
210
|
attach_function :freeaddrinfo, :uv_freeaddrinfo, [UvAddrinfo.by_ref], :void
|
211
211
|
|
212
|
-
attach_function :spawn, :uv_spawn, [:uv_loop_t, :uv_process_t,
|
212
|
+
attach_function :spawn, :uv_spawn, [:uv_loop_t, :uv_process_t, UvProcessOptions.by_ref], :int, :blocking => true
|
213
213
|
attach_function :process_kill, :uv_process_kill, [:uv_process_t, :int], :int, :blocking => true
|
214
214
|
attach_function :kill, :uv_kill, [:int, :int], :int, :blocking => true
|
215
215
|
attach_function :queue_work, :uv_queue_work, [:uv_loop_t, :uv_work_t, :uv_work_cb, :uv_after_work_cb], :int, :blocking => true
|
data/lib/libuv/ext/types.rb
CHANGED
@@ -147,6 +147,33 @@ module Libuv
|
|
147
147
|
:active_handles, :uint
|
148
148
|
end
|
149
149
|
|
150
|
+
enum :uv_stdio_flags, [
|
151
|
+
:UV_IGNORE, 0,
|
152
|
+
:UV_CREATE_PIPE, 1,
|
153
|
+
:UV_INHERIT_FD, 2,
|
154
|
+
:UV_INHERIT_STREAM, 4,
|
155
|
+
:UV_READABLE_PIPE, 0x10,
|
156
|
+
:CREATE_READABLE_PIPE, 0x11,
|
157
|
+
:UV_WRITABLE_PIPE, 0x20,
|
158
|
+
:CREATE_WRITABLE_PIPE, 0x21
|
159
|
+
]
|
160
|
+
|
161
|
+
class StdioData < FFI::Union
|
162
|
+
layout :pipe_handle, :pointer,
|
163
|
+
:fd, :int
|
164
|
+
end
|
165
|
+
|
166
|
+
class UvStdioContainer < FFI::Struct
|
167
|
+
layout :flags, :uv_stdio_flags,
|
168
|
+
:data, StdioData.by_value
|
169
|
+
end
|
170
|
+
|
171
|
+
class StdioObjs < FFI::Struct
|
172
|
+
layout :stdin, UvStdioContainer.by_value,
|
173
|
+
:stdout, UvStdioContainer.by_value,
|
174
|
+
:stderr, UvStdioContainer.by_value
|
175
|
+
end
|
176
|
+
|
150
177
|
typedef :pointer, :sockaddr_in
|
151
178
|
typedef :pointer, :uv_handle_t
|
152
179
|
typedef :pointer, :uv_fs_event_t
|
@@ -205,7 +232,7 @@ module Libuv
|
|
205
232
|
callback :uv_check_cb, [:uv_check_t], :void
|
206
233
|
callback :uv_idle_cb, [:uv_idle_t], :void
|
207
234
|
callback :uv_getaddrinfo_cb, [:uv_getaddrinfo_t, :status, UvAddrinfo.by_ref], :void
|
208
|
-
callback :uv_exit_cb, [:uv_process_t, :
|
235
|
+
callback :uv_exit_cb, [:uv_process_t, :int64, :int], :void
|
209
236
|
callback :uv_walk_cb, [:uv_handle_t, :pointer], :void
|
210
237
|
callback :uv_work_cb, [:uv_work_t], :void
|
211
238
|
callback :uv_after_work_cb, [:uv_work_t, :int], :void
|
@@ -214,5 +241,18 @@ module Libuv
|
|
214
241
|
callback :uv_udp_send_cb, [:uv_udp_send_t, :int], :void
|
215
242
|
callback :uv_udp_recv_cb, [:uv_udp_t, :ssize_t, :uv_buf_t, Sockaddr.by_ref, :uint], :void
|
216
243
|
callback :uv_cb, [], :void
|
244
|
+
|
245
|
+
class UvProcessOptions < FFI::Struct
|
246
|
+
layout :exit_cb, :uv_exit_cb,
|
247
|
+
:file, :pointer,
|
248
|
+
:args, :pointer, # arg[0] == file
|
249
|
+
:env, :pointer, # environment array of strings
|
250
|
+
:cwd, :pointer, # working dir
|
251
|
+
:flags, :uint,
|
252
|
+
:stdio_count, :int,
|
253
|
+
:stdio, StdioObjs.by_ref,
|
254
|
+
:uid, :uint64,
|
255
|
+
:gid, :uint64
|
256
|
+
end
|
217
257
|
end
|
218
258
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Libuv; end
|
4
|
+
|
5
|
+
# Use of a Fiber Pool increases performance as stack allocations
|
6
|
+
# don't need to continually occur. Especially useful on JRuby and
|
7
|
+
# Rubinius where multiple kernel threads and locks emulate Fibers.
|
8
|
+
class Libuv::FiberPool
|
9
|
+
def initialize(thread)
|
10
|
+
@reactor = thread
|
11
|
+
@pool = []
|
12
|
+
@count = 0
|
13
|
+
end
|
14
|
+
|
15
|
+
def exec
|
16
|
+
if @reactor.reactor_thread?
|
17
|
+
# Execute the block in a Fiber
|
18
|
+
next_fiber do
|
19
|
+
begin
|
20
|
+
yield
|
21
|
+
rescue Exception => e
|
22
|
+
@on_error.call(e) if @on_error
|
23
|
+
end
|
24
|
+
end
|
25
|
+
else
|
26
|
+
# move the block onto the reactor thread
|
27
|
+
@reactor.schedule do
|
28
|
+
exec do
|
29
|
+
yield
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def on_error(&block)
|
36
|
+
@on_error = block
|
37
|
+
end
|
38
|
+
|
39
|
+
def available
|
40
|
+
@pool.size
|
41
|
+
end
|
42
|
+
|
43
|
+
def size
|
44
|
+
@count
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
protected
|
49
|
+
|
50
|
+
|
51
|
+
def next_fiber(&block)
|
52
|
+
fib = if @pool.empty?
|
53
|
+
new_fiber
|
54
|
+
else
|
55
|
+
@pool.pop
|
56
|
+
end
|
57
|
+
|
58
|
+
@job = block
|
59
|
+
fib.resume
|
60
|
+
end
|
61
|
+
|
62
|
+
# Fibers are never cleaned up which shouldn't be much of an issue
|
63
|
+
# This might lead to issues on Rubinius or JRuby however it should
|
64
|
+
# generally improve performance on these platforms
|
65
|
+
def new_fiber
|
66
|
+
@count += 1
|
67
|
+
|
68
|
+
Fiber.new do
|
69
|
+
loop do
|
70
|
+
job = @job
|
71
|
+
@job = nil
|
72
|
+
job.call
|
73
|
+
|
74
|
+
@pool << Fiber.current
|
75
|
+
Fiber.yield
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/libuv/file.rb
CHANGED
@@ -232,7 +232,7 @@ module Libuv
|
|
232
232
|
@fileno = req[:result]
|
233
233
|
cleanup(req)
|
234
234
|
@closed = false
|
235
|
-
|
235
|
+
@reactor.exec { @defer.notify(self) }
|
236
236
|
|
237
237
|
if @coroutine
|
238
238
|
@coroutine.resolve(nil)
|
@@ -244,7 +244,7 @@ module Libuv
|
|
244
244
|
def on_close(req)
|
245
245
|
if post_check(req, @defer)
|
246
246
|
cleanup(req)
|
247
|
-
|
247
|
+
@reactor.exec { @defer.resolve(nil) }
|
248
248
|
end
|
249
249
|
end
|
250
250
|
|
@@ -253,7 +253,7 @@ module Libuv
|
|
253
253
|
if post_check(req, deferred)
|
254
254
|
data = buffer1.read_string(req[:result])
|
255
255
|
cleanup(req)
|
256
|
-
|
256
|
+
@reactor.exec { deferred.resolve(data) }
|
257
257
|
end
|
258
258
|
end
|
259
259
|
|
@@ -261,7 +261,7 @@ module Libuv
|
|
261
261
|
deferred, buffer1 = @request_refs.delete req.to_ptr.address
|
262
262
|
if post_check(req, deferred)
|
263
263
|
cleanup(req)
|
264
|
-
|
264
|
+
@reactor.exec { deferred.resolve(nil) }
|
265
265
|
end
|
266
266
|
end
|
267
267
|
|
@@ -269,7 +269,7 @@ module Libuv
|
|
269
269
|
deferred = @request_refs.delete req.to_ptr.address
|
270
270
|
if post_check(req, deferred)
|
271
271
|
cleanup(req)
|
272
|
-
|
272
|
+
@reactor.exec { deferred.resolve(nil) }
|
273
273
|
end
|
274
274
|
end
|
275
275
|
|
@@ -277,7 +277,7 @@ module Libuv
|
|
277
277
|
deferred = @request_refs.delete req.to_ptr.address
|
278
278
|
if post_check(req, deferred)
|
279
279
|
cleanup(req)
|
280
|
-
|
280
|
+
@reactor.exec { deferred.resolve(nil) }
|
281
281
|
end
|
282
282
|
end
|
283
283
|
|
@@ -285,7 +285,7 @@ module Libuv
|
|
285
285
|
deferred = @request_refs.delete req.to_ptr.address
|
286
286
|
if post_check(req, deferred)
|
287
287
|
cleanup(req)
|
288
|
-
|
288
|
+
@reactor.exec { deferred.resolve(nil) }
|
289
289
|
end
|
290
290
|
end
|
291
291
|
|
@@ -293,7 +293,7 @@ module Libuv
|
|
293
293
|
deferred = @request_refs.delete req.to_ptr.address
|
294
294
|
if post_check(req, deferred)
|
295
295
|
cleanup(req)
|
296
|
-
|
296
|
+
@reactor.exec { deferred.resolve(nil) }
|
297
297
|
end
|
298
298
|
end
|
299
299
|
|
@@ -301,7 +301,7 @@ module Libuv
|
|
301
301
|
deferred = @request_refs.delete req.to_ptr.address
|
302
302
|
if post_check(req, deferred)
|
303
303
|
cleanup(req)
|
304
|
-
|
304
|
+
@reactor.exec { deferred.resolve(nil) }
|
305
305
|
end
|
306
306
|
end
|
307
307
|
|
@@ -309,7 +309,7 @@ module Libuv
|
|
309
309
|
deferred = @request_refs.delete req.to_ptr.address
|
310
310
|
if post_check(req, deferred)
|
311
311
|
cleanup(req)
|
312
|
-
|
312
|
+
@reactor.exec { deferred.resolve(nil) }
|
313
313
|
end
|
314
314
|
end
|
315
315
|
end
|
data/lib/libuv/filesystem.rb
CHANGED
@@ -152,7 +152,7 @@ module Libuv
|
|
152
152
|
if post_check(req, @unlink_deferred)
|
153
153
|
path = req[:path]
|
154
154
|
cleanup(req)
|
155
|
-
|
155
|
+
@reactor.exec { @unlink_deferred.resolve(path) }
|
156
156
|
end
|
157
157
|
@unlink_deferred = nil
|
158
158
|
end
|
@@ -161,7 +161,7 @@ module Libuv
|
|
161
161
|
if post_check(req, @mkdir_deferred)
|
162
162
|
path = req[:path]
|
163
163
|
cleanup(req)
|
164
|
-
|
164
|
+
@reactor.exec { @mkdir_deferred.resolve(path) }
|
165
165
|
end
|
166
166
|
@mkdir_deferred = nil
|
167
167
|
end
|
@@ -170,7 +170,7 @@ module Libuv
|
|
170
170
|
if post_check(req, @rmdir_deferred)
|
171
171
|
path = req[:path]
|
172
172
|
cleanup(req)
|
173
|
-
|
173
|
+
@reactor.exec { @rmdir_deferred.resolve(path) }
|
174
174
|
end
|
175
175
|
@rmdir_deferred = nil
|
176
176
|
end
|
@@ -191,7 +191,7 @@ module Libuv
|
|
191
191
|
end
|
192
192
|
|
193
193
|
cleanup(req)
|
194
|
-
|
194
|
+
@reactor.exec { @readdir_deferred.resolve(files) }
|
195
195
|
end
|
196
196
|
@readdir_deferred = nil
|
197
197
|
end
|
@@ -200,7 +200,7 @@ module Libuv
|
|
200
200
|
if post_check(req, @rename_deferred)
|
201
201
|
path = req[:path]
|
202
202
|
cleanup(req)
|
203
|
-
|
203
|
+
@reactor.exec { @rename_deferred.resolve(path) }
|
204
204
|
end
|
205
205
|
@rename_deferred = nil
|
206
206
|
end
|
@@ -209,7 +209,7 @@ module Libuv
|
|
209
209
|
if post_check(req, @chmod_deferred)
|
210
210
|
path = req[:path]
|
211
211
|
cleanup(req)
|
212
|
-
|
212
|
+
@reactor.exec { @chmod_deferred.resolve(path) }
|
213
213
|
end
|
214
214
|
@chmod_deferred = nil
|
215
215
|
end
|
@@ -218,7 +218,7 @@ module Libuv
|
|
218
218
|
if post_check(req, @utime_deferred)
|
219
219
|
path = req[:path]
|
220
220
|
cleanup(req)
|
221
|
-
|
221
|
+
@reactor.exec { @utime_deferred.resolve(path) }
|
222
222
|
end
|
223
223
|
@utime_deferred = nil
|
224
224
|
end
|
@@ -227,7 +227,7 @@ module Libuv
|
|
227
227
|
if post_check(req, @link_deferred)
|
228
228
|
path = req[:path]
|
229
229
|
cleanup(req)
|
230
|
-
|
230
|
+
@reactor.exec { @link_deferred.resolve(path) }
|
231
231
|
end
|
232
232
|
@link_deferred = nil
|
233
233
|
end
|
@@ -236,7 +236,7 @@ module Libuv
|
|
236
236
|
if post_check(req, @symlink_deferred)
|
237
237
|
path = req[:path]
|
238
238
|
cleanup(req)
|
239
|
-
|
239
|
+
@reactor.exec { @symlink_deferred.resolve(path) }
|
240
240
|
end
|
241
241
|
@symlink_deferred = nil
|
242
242
|
end
|
@@ -246,7 +246,7 @@ module Libuv
|
|
246
246
|
string_ptr = req[:ptr]
|
247
247
|
path = string_ptr.null? ? nil : string_ptr.read_string_to_null
|
248
248
|
cleanup(req)
|
249
|
-
|
249
|
+
@reactor.exec { @readlink_deferred.resolve(path) }
|
250
250
|
end
|
251
251
|
@readlink_deferred = nil
|
252
252
|
end
|
@@ -255,7 +255,7 @@ module Libuv
|
|
255
255
|
if post_check(req, @chown_deferred)
|
256
256
|
path = req[:path]
|
257
257
|
cleanup(req)
|
258
|
-
|
258
|
+
@reactor.exec { @chown_deferred.resolve(path) }
|
259
259
|
end
|
260
260
|
@chown_deferred = nil
|
261
261
|
end
|
data/lib/libuv/fs_event.rb
CHANGED
data/lib/libuv/handle.rb
CHANGED
@@ -91,7 +91,7 @@ module Libuv
|
|
91
91
|
#clear_callbacks
|
92
92
|
cleanup_callbacks
|
93
93
|
|
94
|
-
|
94
|
+
@reactor.exec do
|
95
95
|
if @close_error
|
96
96
|
defer.reject(@close_error)
|
97
97
|
else
|
@@ -102,7 +102,7 @@ module Libuv
|
|
102
102
|
@coroutine.resolve(self)
|
103
103
|
@coroutine = nil
|
104
104
|
end
|
105
|
-
|
105
|
+
end
|
106
106
|
end
|
107
107
|
end
|
108
108
|
end
|
data/lib/libuv/idle.rb
CHANGED
@@ -53,7 +53,7 @@ module Libuv
|
|
53
53
|
end
|
54
54
|
|
55
55
|
cleanup(req)
|
56
|
-
|
56
|
+
@reactor.exec { @stat_deferred.resolve(stats) }
|
57
57
|
end
|
58
58
|
@stat_deferred = nil
|
59
59
|
end
|
@@ -80,13 +80,13 @@ module Libuv
|
|
80
80
|
if error
|
81
81
|
cleanup(req)
|
82
82
|
|
83
|
-
|
83
|
+
@reactor.exec do
|
84
84
|
deferrable.reject(error)
|
85
85
|
if @coroutine
|
86
86
|
@coroutine.resolve(deferrable.promise)
|
87
87
|
@coroutine = nil
|
88
88
|
end
|
89
|
-
|
89
|
+
end
|
90
90
|
false
|
91
91
|
else
|
92
92
|
true
|
data/lib/libuv/mixins/stream.rb
CHANGED
@@ -201,7 +201,7 @@ module Libuv
|
|
201
201
|
def on_listen(server, status)
|
202
202
|
e = check_result(status)
|
203
203
|
|
204
|
-
|
204
|
+
@reactor.exec do
|
205
205
|
if e
|
206
206
|
reject(e) # is this cause for closing the handle?
|
207
207
|
else
|
@@ -211,7 +211,7 @@ module Libuv
|
|
211
211
|
@reactor.log e, 'performing stream listening callback'
|
212
212
|
end
|
213
213
|
end
|
214
|
-
|
214
|
+
end
|
215
215
|
end
|
216
216
|
|
217
217
|
def on_allocate(client, suggested_size, buffer)
|
@@ -226,10 +226,10 @@ module Libuv
|
|
226
226
|
::Libuv::Ext.free(req)
|
227
227
|
buffer1.free
|
228
228
|
|
229
|
-
|
229
|
+
@reactor.exec do
|
230
230
|
resolve deferred, status
|
231
231
|
check_flush_buffer if @flush_defer
|
232
|
-
|
232
|
+
end
|
233
233
|
end
|
234
234
|
|
235
235
|
def on_read(handle, nread, buf)
|
@@ -239,19 +239,19 @@ module Libuv
|
|
239
239
|
if e
|
240
240
|
::Libuv::Ext.free(base)
|
241
241
|
|
242
|
-
|
242
|
+
@reactor.exec do
|
243
243
|
# I assume this is desirable behaviour
|
244
244
|
if e.is_a? ::Libuv::Error::EOF
|
245
245
|
close # Close gracefully
|
246
246
|
else
|
247
247
|
reject(e)
|
248
248
|
end
|
249
|
-
|
249
|
+
end
|
250
250
|
else
|
251
251
|
data = base.read_string(nread)
|
252
252
|
::Libuv::Ext.free(base)
|
253
253
|
|
254
|
-
|
254
|
+
@reactor.exec do
|
255
255
|
if @tls.nil?
|
256
256
|
begin
|
257
257
|
@progress.call data, self
|
@@ -261,7 +261,7 @@ module Libuv
|
|
261
261
|
else
|
262
262
|
@tls.decrypt(data)
|
263
263
|
end
|
264
|
-
|
264
|
+
end
|
265
265
|
end
|
266
266
|
end
|
267
267
|
|
@@ -270,7 +270,7 @@ module Libuv
|
|
270
270
|
::Libuv::Ext.free(req)
|
271
271
|
@close_error = check_result(status)
|
272
272
|
|
273
|
-
|
273
|
+
@reactor.exec { close }
|
274
274
|
end
|
275
275
|
end
|
276
276
|
end
|
data/lib/libuv/pipe.rb
CHANGED
@@ -165,13 +165,13 @@ module Libuv
|
|
165
165
|
@reactor.log e, 'pipe accept failed'
|
166
166
|
end
|
167
167
|
if pipe
|
168
|
-
|
168
|
+
@reactor.exec do
|
169
169
|
begin
|
170
170
|
@on_accept.call(pipe)
|
171
171
|
rescue Exception => e
|
172
172
|
@reactor.log e, 'performing pipe accept callback'
|
173
173
|
end
|
174
|
-
|
174
|
+
end
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
@@ -180,7 +180,7 @@ module Libuv
|
|
180
180
|
::Libuv::Ext.free(req)
|
181
181
|
e = check_result(status)
|
182
182
|
|
183
|
-
|
183
|
+
@reactor.exec do
|
184
184
|
if e
|
185
185
|
reject(e)
|
186
186
|
else
|
@@ -190,7 +190,7 @@ module Libuv
|
|
190
190
|
@reactor.log e, 'performing pipe connected callback'
|
191
191
|
end
|
192
192
|
end
|
193
|
-
|
193
|
+
end
|
194
194
|
end
|
195
195
|
|
196
196
|
def write2_complete(req, status)
|
@@ -199,9 +199,9 @@ module Libuv
|
|
199
199
|
|
200
200
|
::Libuv::Ext.free(req)
|
201
201
|
|
202
|
-
|
202
|
+
@reactor.exec do
|
203
203
|
resolve promise, status
|
204
|
-
|
204
|
+
end
|
205
205
|
end
|
206
206
|
|
207
207
|
def windows_path(name)
|
data/lib/libuv/prepare.rb
CHANGED
data/lib/libuv/reactor.rb
CHANGED
@@ -58,6 +58,7 @@ module Libuv
|
|
58
58
|
@reactor = self
|
59
59
|
@run_count = 0
|
60
60
|
@ref_count = 0
|
61
|
+
@fiber_pool = FiberPool.new(self)
|
61
62
|
|
62
63
|
# Create an async call for scheduling work from other threads
|
63
64
|
@run_queue = Queue.new
|
@@ -91,9 +92,10 @@ module Libuv
|
|
91
92
|
@reactor_notify_default = @reactor_notify = proc { |error|
|
92
93
|
@throw_on_exit = error
|
93
94
|
}
|
95
|
+
@fiber_pool.on_error &@reactor_notify
|
94
96
|
end
|
95
97
|
|
96
|
-
attr_reader :run_count
|
98
|
+
attr_reader :run_count, :fiber_pool
|
97
99
|
|
98
100
|
|
99
101
|
protected
|
@@ -128,7 +130,7 @@ module Libuv
|
|
128
130
|
update_time
|
129
131
|
length.times do
|
130
132
|
# This allows any item to pause its execution without effecting this loop
|
131
|
-
|
133
|
+
@fiber_pool.exec { process_item }
|
132
134
|
end
|
133
135
|
end
|
134
136
|
|
@@ -167,17 +169,8 @@ module Libuv
|
|
167
169
|
|
168
170
|
Thread.current.thread_variable_set(:reactor, @reactor)
|
169
171
|
@throw_on_exit = nil
|
170
|
-
|
171
|
-
if block_given?
|
172
|
-
update_time
|
173
|
-
::Fiber.new {
|
174
|
-
begin
|
175
|
-
yield @reactor
|
176
|
-
rescue Exception => e
|
177
|
-
log(e, 'in reactor run block')
|
178
|
-
end
|
179
|
-
}.resume
|
180
|
-
end
|
172
|
+
update_time
|
173
|
+
@fiber_pool.exec { yield @reactor } if block_given?
|
181
174
|
@run_count += 1
|
182
175
|
::Libuv::Ext.run(@pointer, run_type) # This is blocking
|
183
176
|
ensure
|
@@ -201,6 +194,11 @@ module Libuv
|
|
201
194
|
@reactor
|
202
195
|
end
|
203
196
|
|
197
|
+
# Execute the provided block of code in a fiber from the pool
|
198
|
+
def exec
|
199
|
+
@fiber_pool.exec { yield }
|
200
|
+
end
|
201
|
+
|
204
202
|
# Prevents the reactor loop from stopping
|
205
203
|
def ref
|
206
204
|
if reactor_thread? && reactor_running?
|
data/lib/libuv/signal.rb
CHANGED
data/lib/libuv/spawn.rb
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Libuv
|
4
|
+
class Spawn < Handle
|
5
|
+
define_callback function: :on_exit, params: [:pointer, :int64, :int]
|
6
|
+
|
7
|
+
attr_reader :stdin, :stdout, :stderr
|
8
|
+
|
9
|
+
# @param reactor [::Libuv::Reactor] reactor this timer will be associated
|
10
|
+
# @param callback [Proc] callback to be called when the timer is triggered
|
11
|
+
def initialize(reactor, cmd, working_dir: '.', args: [], env: nil, flags: 0, mode: :capture)
|
12
|
+
@reactor = reactor
|
13
|
+
|
14
|
+
process_ptr = ::Libuv::Ext.allocate_handle_process
|
15
|
+
@options = Ext::UvProcessOptions.new
|
16
|
+
|
17
|
+
# Configure IO objects
|
18
|
+
@io_obj = Ext::StdioObjs.new
|
19
|
+
case mode.to_sym
|
20
|
+
when :capture
|
21
|
+
@stdin = @reactor.pipe
|
22
|
+
@stdout = @reactor.pipe
|
23
|
+
@stderr = @reactor.pipe
|
24
|
+
@io_obj[:stdin] = build_stdio(:CREATE_READABLE_PIPE, pipe: @stdin)
|
25
|
+
@io_obj[:stdout] = build_stdio(:CREATE_WRITABLE_PIPE, pipe: @stdout)
|
26
|
+
@io_obj[:stderr] = build_stdio(:CREATE_WRITABLE_PIPE, pipe: @stderr)
|
27
|
+
when :ignore
|
28
|
+
@io_obj[:stdin] = build_stdio(:UV_IGNORE)
|
29
|
+
@io_obj[:stdout] = build_stdio(:UV_IGNORE)
|
30
|
+
@io_obj[:stderr] = build_stdio(:UV_IGNORE)
|
31
|
+
when :inherit
|
32
|
+
@io_obj[:stdin] = build_stdio(:UV_INHERIT_FD, fd: ::STDIN.fileno)
|
33
|
+
@io_obj[:stdout] = build_stdio(:UV_INHERIT_FD, fd: ::STDOUT.fileno)
|
34
|
+
@io_obj[:stderr] = build_stdio(:UV_INHERIT_FD, fd: ::STDERR.fileno)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Configure arguments
|
38
|
+
@cmd = FFI::MemoryPointer.from_string(cmd)
|
39
|
+
@args = args.map { |arg| FFI::MemoryPointer.from_string(arg) }
|
40
|
+
@args.unshift(@cmd)
|
41
|
+
@args_ptr = FFI::MemoryPointer.new(:pointer, @args.length + 1)
|
42
|
+
@args_ptr.write_array_of_pointer(@args)
|
43
|
+
|
44
|
+
# Configure environment
|
45
|
+
if env
|
46
|
+
@env = env.map { |e| FFI::MemoryPointer.from_string(e) }
|
47
|
+
@env_ptr = FFI::MemoryPointer.new(:pointer, @env.length + 1)
|
48
|
+
@env_ptr.write_array_of_pointer(@env)
|
49
|
+
end
|
50
|
+
|
51
|
+
@working_dir = FFI::MemoryPointer.from_string(working_dir)
|
52
|
+
|
53
|
+
# Apply the options
|
54
|
+
@options[:exit_cb] = callback(:on_exit, process_ptr.address)
|
55
|
+
@options[:file] = @cmd
|
56
|
+
@options[:args] = @args_ptr
|
57
|
+
@options[:env] = @env_ptr
|
58
|
+
@options[:cwd] = @working_dir
|
59
|
+
@options[:flags] = 0
|
60
|
+
@options[:stdio_count] = 3
|
61
|
+
@options[:stdio] = @io_obj
|
62
|
+
|
63
|
+
error = check_result(::Libuv::Ext.spawn(reactor.handle, process_ptr, @options))
|
64
|
+
super(process_ptr, error)
|
65
|
+
end
|
66
|
+
|
67
|
+
def kill(signal = 2)
|
68
|
+
return self if @closed
|
69
|
+
::Libuv::Ext.process_kill(handle, signal)
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
|
77
|
+
def build_stdio(flags, pipe: nil, fd: nil)
|
78
|
+
io = Ext::UvStdioContainer.new
|
79
|
+
io[:flags] = flags
|
80
|
+
if pipe
|
81
|
+
io[:data][:pipe_handle] = pipe.handle
|
82
|
+
elsif fd
|
83
|
+
io[:data][:fd] = fd
|
84
|
+
end
|
85
|
+
io
|
86
|
+
end
|
87
|
+
|
88
|
+
def on_exit(handle, exit_status, term_signal)
|
89
|
+
@reactor.exec do
|
90
|
+
if exit_status == 0
|
91
|
+
@defer.resolve(term_signal)
|
92
|
+
else
|
93
|
+
err = ::Libuv::Error::ProcessExitCode.new "Non-zero exit code returned #{exit_status}"
|
94
|
+
err.exit_status = exit_status
|
95
|
+
err.term_signal = term_signal
|
96
|
+
@defer.reject(err)
|
97
|
+
end
|
98
|
+
|
99
|
+
if @stdin
|
100
|
+
@reactor.next_tick do
|
101
|
+
@stdin.close
|
102
|
+
@stdout.close
|
103
|
+
@stderr.close
|
104
|
+
|
105
|
+
close
|
106
|
+
end
|
107
|
+
else
|
108
|
+
close
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
data/lib/libuv/tcp.rb
CHANGED
@@ -12,7 +12,7 @@ module Libuv
|
|
12
12
|
define_callback function: :on_connect, params: [:pointer, :int]
|
13
13
|
|
14
14
|
|
15
|
-
TLS_ERROR = "TLS write failed"
|
15
|
+
TLS_ERROR = "TLS write failed"
|
16
16
|
|
17
17
|
|
18
18
|
attr_reader :connected
|
@@ -259,7 +259,7 @@ module Libuv
|
|
259
259
|
@callback = callback || blk
|
260
260
|
@coroutine = @reactor.defer if @callback.nil?
|
261
261
|
end
|
262
|
-
error = check_result
|
262
|
+
error = check_result ::Libuv::Ext.tcp_open(handle, fd)
|
263
263
|
reject(error) if error
|
264
264
|
co @coroutine.promise if @coroutine
|
265
265
|
|
@@ -288,6 +288,7 @@ module Libuv
|
|
288
288
|
self
|
289
289
|
end
|
290
290
|
|
291
|
+
# The name of the client (local) end of the socket
|
291
292
|
def sockname
|
292
293
|
return [] if @closed
|
293
294
|
sockaddr, len = get_sockaddr_and_len
|
@@ -295,6 +296,7 @@ module Libuv
|
|
295
296
|
get_ip_and_port(::Libuv::Ext::Sockaddr.new(sockaddr), len.get_int(0))
|
296
297
|
end
|
297
298
|
|
299
|
+
# The IP address of the peer (remote) end of the socket
|
298
300
|
def peername
|
299
301
|
return [] if @closed
|
300
302
|
sockaddr, len = get_sockaddr_and_len
|
@@ -355,7 +357,7 @@ module Libuv
|
|
355
357
|
::Libuv::Ext.free(req)
|
356
358
|
e = check_result(status)
|
357
359
|
|
358
|
-
|
360
|
+
@reactor.exec do
|
359
361
|
if e
|
360
362
|
reject(e)
|
361
363
|
else
|
@@ -375,7 +377,7 @@ module Libuv
|
|
375
377
|
@reactor.log e, 'performing TCP connection callback'
|
376
378
|
end
|
377
379
|
end
|
378
|
-
|
380
|
+
end
|
379
381
|
end
|
380
382
|
|
381
383
|
def accept(_)
|
@@ -383,13 +385,13 @@ module Libuv
|
|
383
385
|
raise RuntimeError, CLOSED_HANDLE_ERROR if @closed
|
384
386
|
tcp = TCP.new(reactor, handle, **@tls_options)
|
385
387
|
|
386
|
-
|
388
|
+
@reactor.exec do
|
387
389
|
begin
|
388
390
|
@on_accept.call(tcp)
|
389
391
|
rescue Exception => e
|
390
392
|
@reactor.log e, 'performing TCP accept callback'
|
391
393
|
end
|
392
|
-
|
394
|
+
end
|
393
395
|
rescue Exception => e
|
394
396
|
@reactor.log e, 'failed to accept TCP connection'
|
395
397
|
end
|
data/lib/libuv/timer.rb
CHANGED
@@ -97,13 +97,13 @@ module Libuv
|
|
97
97
|
|
98
98
|
|
99
99
|
def on_timer(handle)
|
100
|
-
|
100
|
+
@reactor.exec do
|
101
101
|
begin
|
102
102
|
@callback.call
|
103
103
|
rescue Exception => e
|
104
104
|
@reactor.log e, 'performing timer callback'
|
105
105
|
end
|
106
|
-
|
106
|
+
end
|
107
107
|
end
|
108
108
|
end
|
109
109
|
end
|
data/lib/libuv/udp.rb
CHANGED
@@ -47,9 +47,9 @@ module Libuv
|
|
47
47
|
self
|
48
48
|
end
|
49
49
|
|
50
|
-
def open(fd, binding = true
|
50
|
+
def open(fd, binding = true)
|
51
51
|
return if @closed
|
52
|
-
error = check_result
|
52
|
+
error = check_result ::Libuv::Ext.udp_open(handle, fd)
|
53
53
|
reject(error) if error
|
54
54
|
|
55
55
|
self
|
@@ -268,20 +268,20 @@ module Libuv
|
|
268
268
|
e = check_result(nread)
|
269
269
|
|
270
270
|
if e
|
271
|
-
|
271
|
+
@reactor.exec { reject(e) } # Will call close
|
272
272
|
elsif nread > 0
|
273
273
|
data = @receive_buff.read_string(nread)
|
274
274
|
unless sockaddr.null?
|
275
275
|
ip, port = get_ip_and_port(sockaddr)
|
276
276
|
end
|
277
277
|
|
278
|
-
|
278
|
+
@reactor.exec do
|
279
279
|
begin
|
280
280
|
@progress.call data, ip, port, self
|
281
281
|
rescue Exception => e
|
282
282
|
@reactor.log e, 'performing UDP data received callback'
|
283
283
|
end
|
284
|
-
|
284
|
+
end
|
285
285
|
else
|
286
286
|
::Libuv::Ext.free(@receive_buff)
|
287
287
|
@receive_buff = nil
|
@@ -296,7 +296,7 @@ module Libuv
|
|
296
296
|
::Libuv::Ext.free(req)
|
297
297
|
buffer1.free
|
298
298
|
|
299
|
-
|
299
|
+
@reactor.exec { resolve(deferred, status) }
|
300
300
|
end
|
301
301
|
end
|
302
302
|
end
|
data/lib/libuv/version.rb
CHANGED
data/lib/libuv/work.rb
CHANGED
@@ -58,7 +58,7 @@ module Libuv
|
|
58
58
|
@complete = true
|
59
59
|
::Libuv::Ext.free(req)
|
60
60
|
|
61
|
-
|
61
|
+
@reactor.exec do
|
62
62
|
e = check_result(status)
|
63
63
|
if e
|
64
64
|
@defer.reject(e)
|
@@ -69,8 +69,8 @@ module Libuv
|
|
69
69
|
@defer.resolve(@result)
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
73
|
-
|
72
|
+
end
|
73
|
+
|
74
74
|
# Clean up references
|
75
75
|
cleanup_callbacks @instance_id
|
76
76
|
end
|
data/spec/idle_spec.rb
CHANGED
data/spec/spawn_spec.rb
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'libuv'
|
2
|
+
|
3
|
+
describe Libuv::Spawn do
|
4
|
+
describe 'basic spawn of external process' do
|
5
|
+
it "should accept arguments and return an termination signal code" do
|
6
|
+
@reactor = Libuv::Reactor.new
|
7
|
+
@log = []
|
8
|
+
@reactor.run { |reactor|
|
9
|
+
begin
|
10
|
+
p = Libuv::Spawn.new(reactor, './spec/test.sh', args: ['arg1', 'arg2'], env: ['SOME_VAR=123'])
|
11
|
+
p.stdout.progress do |data|
|
12
|
+
@log << data
|
13
|
+
end
|
14
|
+
p.stdout.start_read
|
15
|
+
@log << p.value
|
16
|
+
rescue => e
|
17
|
+
@log << e
|
18
|
+
@reactor.stop
|
19
|
+
end
|
20
|
+
}
|
21
|
+
|
22
|
+
term_signal = @log.pop
|
23
|
+
expect(term_signal).to be(0)
|
24
|
+
|
25
|
+
expect(@log[0]).to eq("123\narg1\narg2\n")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should return termination signal if exit code was 0" do
|
29
|
+
@reactor = Libuv::Reactor.new
|
30
|
+
@log = []
|
31
|
+
@reactor.run { |reactor|
|
32
|
+
begin
|
33
|
+
p = Libuv::Spawn.new(reactor, './spec/test.sh', args: ['arg1', 'arg2'], env: ['SOME_VAR=123'])
|
34
|
+
p.kill
|
35
|
+
p.stdout.progress do |data|
|
36
|
+
@log << data
|
37
|
+
end
|
38
|
+
p.stdout.start_read
|
39
|
+
@log << p.value
|
40
|
+
rescue => e
|
41
|
+
@log << e
|
42
|
+
@reactor.stop
|
43
|
+
end
|
44
|
+
}
|
45
|
+
|
46
|
+
term_signal = @log.pop
|
47
|
+
expect(term_signal).to be(2)
|
48
|
+
expect(@log[0]).to be(nil)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should fail if exit code was not 0 and read output from stderr" do
|
52
|
+
@reactor = Libuv::Reactor.new
|
53
|
+
@log = []
|
54
|
+
@reactor.run { |reactor|
|
55
|
+
begin
|
56
|
+
p = Libuv::Spawn.new(reactor, './spec/test_fail.sh')
|
57
|
+
p.stderr.progress do |data|
|
58
|
+
@log << data
|
59
|
+
end
|
60
|
+
p.stderr.start_read
|
61
|
+
@log << p.value
|
62
|
+
rescue => e
|
63
|
+
@log << e
|
64
|
+
@reactor.stop
|
65
|
+
end
|
66
|
+
}
|
67
|
+
|
68
|
+
stderr = @log[0]
|
69
|
+
e = @log[1]
|
70
|
+
expect(e.class).to be(::Libuv::Error::ProcessExitCode)
|
71
|
+
expect(e.exit_status).to be(1)
|
72
|
+
expect(e.term_signal).to be(0)
|
73
|
+
expect(stderr.length).to be > 0
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should be interactive" do
|
77
|
+
@reactor = Libuv::Reactor.new
|
78
|
+
@log = []
|
79
|
+
@reactor.run { |reactor|
|
80
|
+
begin
|
81
|
+
p = Libuv::Spawn.new(reactor, './spec/test_read.sh')
|
82
|
+
p.stdout.progress do |data|
|
83
|
+
@log << data
|
84
|
+
end
|
85
|
+
p.stdout.start_read
|
86
|
+
p.stdin.write("2017\n")
|
87
|
+
@log << p.value
|
88
|
+
rescue => e
|
89
|
+
@log << e
|
90
|
+
@reactor.stop
|
91
|
+
end
|
92
|
+
}
|
93
|
+
|
94
|
+
term_signal = @log.pop
|
95
|
+
expect(term_signal).to be(0)
|
96
|
+
|
97
|
+
expect(@log[0]).to eq("you entered 2017 - sweet\n")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should support inheriting parent processes streams" do
|
101
|
+
@reactor = Libuv::Reactor.new
|
102
|
+
@log = []
|
103
|
+
@reactor.run { |reactor|
|
104
|
+
begin
|
105
|
+
p = Libuv::Spawn.new(reactor, './spec/test.sh', args: ['arg1', 'arg2'], env: ['SOME_VAR=123'], mode: :inherit)
|
106
|
+
@log << p.stdout
|
107
|
+
@log << p.value
|
108
|
+
rescue => e
|
109
|
+
@log << e
|
110
|
+
@reactor.stop
|
111
|
+
end
|
112
|
+
}
|
113
|
+
|
114
|
+
term_signal = @log.pop
|
115
|
+
expect(term_signal).to be(0)
|
116
|
+
expect(@log[0]).to be(nil)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
data/spec/test.sh
ADDED
data/spec/test_fail.sh
ADDED
data/spec/test_read.sh
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libuv
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen von Takach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -450,6 +450,7 @@ files:
|
|
450
450
|
- ext/libuv/test/test-poll-close-doesnt-corrupt-stack.c
|
451
451
|
- ext/libuv/test/test-poll-close.c
|
452
452
|
- ext/libuv/test/test-poll-closesocket.c
|
453
|
+
- ext/libuv/test/test-poll-oob.c
|
453
454
|
- ext/libuv/test/test-poll.c
|
454
455
|
- ext/libuv/test/test-process-title.c
|
455
456
|
- ext/libuv/test/test-queue-foreach-delete.c
|
@@ -517,6 +518,7 @@ files:
|
|
517
518
|
- ext/libuv/test/test-walk-handles.c
|
518
519
|
- ext/libuv/test/test-watcher-cross-stop.c
|
519
520
|
- ext/libuv/tools/make_dist_html.py
|
521
|
+
- ext/libuv/tools/vswhere_usability_wrapper.cmd
|
520
522
|
- ext/libuv/uv.gyp
|
521
523
|
- ext/libuv/vcbuild.bat
|
522
524
|
- lib/libuv.rb
|
@@ -534,6 +536,7 @@ files:
|
|
534
536
|
- lib/libuv/ext/tasks/unix.rb
|
535
537
|
- lib/libuv/ext/tasks/win.rb
|
536
538
|
- lib/libuv/ext/types.rb
|
539
|
+
- lib/libuv/fiber_pool.rb
|
537
540
|
- lib/libuv/file.rb
|
538
541
|
- lib/libuv/filesystem.rb
|
539
542
|
- lib/libuv/fs_event.rb
|
@@ -551,6 +554,7 @@ files:
|
|
551
554
|
- lib/libuv/q.rb
|
552
555
|
- lib/libuv/reactor.rb
|
553
556
|
- lib/libuv/signal.rb
|
557
|
+
- lib/libuv/spawn.rb
|
554
558
|
- lib/libuv/tcp.rb
|
555
559
|
- lib/libuv/timer.rb
|
556
560
|
- lib/libuv/tty.rb
|
@@ -567,7 +571,11 @@ files:
|
|
567
571
|
- spec/filesystem_spec.rb
|
568
572
|
- spec/idle_spec.rb
|
569
573
|
- spec/pipe_spec.rb
|
574
|
+
- spec/spawn_spec.rb
|
570
575
|
- spec/tcp_spec.rb
|
576
|
+
- spec/test.sh
|
577
|
+
- spec/test_fail.sh
|
578
|
+
- spec/test_read.sh
|
571
579
|
- spec/timer_spec.rb
|
572
580
|
- spec/udp_spec.rb
|
573
581
|
- spec/zen_spec.rb
|
@@ -591,7 +599,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
591
599
|
version: '0'
|
592
600
|
requirements: []
|
593
601
|
rubyforge_project:
|
594
|
-
rubygems_version: 2.6.
|
602
|
+
rubygems_version: 2.6.12
|
595
603
|
signing_key:
|
596
604
|
specification_version: 4
|
597
605
|
summary: libuv bindings for Ruby
|
@@ -605,7 +613,11 @@ test_files:
|
|
605
613
|
- spec/filesystem_spec.rb
|
606
614
|
- spec/idle_spec.rb
|
607
615
|
- spec/pipe_spec.rb
|
616
|
+
- spec/spawn_spec.rb
|
608
617
|
- spec/tcp_spec.rb
|
618
|
+
- spec/test.sh
|
619
|
+
- spec/test_fail.sh
|
620
|
+
- spec/test_read.sh
|
609
621
|
- spec/timer_spec.rb
|
610
622
|
- spec/udp_spec.rb
|
611
623
|
- spec/zen_spec.rb
|