libuv 2.0.12 → 3.0.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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/README.md +67 -34
  4. data/lib/libuv.rb +30 -5
  5. data/lib/libuv/async.rb +16 -10
  6. data/lib/libuv/check.rb +19 -12
  7. data/lib/libuv/coroutines.rb +39 -12
  8. data/lib/libuv/dns.rb +25 -18
  9. data/lib/libuv/error.rb +2 -0
  10. data/lib/libuv/ext/ext.rb +28 -36
  11. data/lib/libuv/ext/platform/darwin_x64.rb +2 -0
  12. data/lib/libuv/ext/platform/unix.rb +2 -0
  13. data/lib/libuv/ext/platform/windows.rb +2 -0
  14. data/lib/libuv/ext/tasks.rb +2 -0
  15. data/lib/libuv/ext/tasks/mac.rb +2 -0
  16. data/lib/libuv/ext/tasks/unix.rb +2 -0
  17. data/lib/libuv/ext/tasks/win.rb +2 -0
  18. data/lib/libuv/ext/types.rb +2 -1
  19. data/lib/libuv/file.rb +67 -50
  20. data/lib/libuv/filesystem.rb +63 -61
  21. data/lib/libuv/fs_event.rb +7 -4
  22. data/lib/libuv/handle.rb +30 -14
  23. data/lib/libuv/idle.rb +17 -10
  24. data/lib/libuv/mixins/accessors.rb +41 -0
  25. data/lib/libuv/mixins/assertions.rb +3 -1
  26. data/lib/libuv/mixins/fs_checks.rb +29 -6
  27. data/lib/libuv/mixins/listener.rb +4 -2
  28. data/lib/libuv/mixins/net.rb +4 -2
  29. data/lib/libuv/mixins/resource.rb +5 -3
  30. data/lib/libuv/mixins/stream.rb +128 -35
  31. data/lib/libuv/pipe.rb +54 -27
  32. data/lib/libuv/prepare.rb +19 -12
  33. data/lib/libuv/q.rb +109 -101
  34. data/lib/libuv/{loop.rb → reactor.rb} +163 -85
  35. data/lib/libuv/signal.rb +13 -5
  36. data/lib/libuv/tcp.rb +109 -63
  37. data/lib/libuv/timer.rb +44 -24
  38. data/lib/libuv/tty.rb +8 -3
  39. data/lib/libuv/udp.rb +49 -22
  40. data/lib/libuv/version.rb +3 -1
  41. data/lib/libuv/work.rb +14 -10
  42. data/libuv.gemspec +11 -9
  43. data/spec/async_spec.rb +13 -13
  44. data/spec/coroutines_spec.rb +20 -50
  45. data/spec/defer_spec.rb +182 -311
  46. data/spec/dns_spec.rb +51 -41
  47. data/spec/dsl_spec.rb +43 -0
  48. data/spec/filesystem_spec.rb +65 -87
  49. data/spec/idle_spec.rb +19 -33
  50. data/spec/pipe_spec.rb +25 -32
  51. data/spec/tcp_spec.rb +116 -53
  52. data/spec/timer_spec.rb +3 -3
  53. data/spec/udp_spec.rb +16 -17
  54. data/spec/zen_spec.rb +2 -3
  55. metadata +37 -30
data/lib/libuv/error.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Libuv
2
4
  class Error < StandardError
3
5
  class E2BIG < Error; end
data/lib/libuv/ext/ext.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
  require 'ffi'
3
5
 
@@ -13,28 +15,23 @@ module Libuv
13
15
  extend FFI::Library
14
16
  ffi_lib(FFI::Library::LIBC).first
15
17
 
16
- attach_function :malloc, [:size_t], :pointer, :blocking => true
17
- attach_function :free, [:pointer], :void, :blocking => true
18
+ attach_function :malloc, [:size_t], :pointer
19
+ attach_function :free, [:pointer], :void
18
20
  end
19
-
21
+ def_delegators :LIBC, :malloc, :free
22
+ module_function :malloc, :free
20
23
 
21
- def self.malloc(size)
22
- LIBC.malloc(size)
23
- end
24
24
 
25
- def self.free(data)
26
- LIBC.free(data)
25
+ def self.path_to_internal_libuv
26
+ @path_to_internal_libuv ||= ::File.expand_path("../../../../ext/libuv/lib/libuv.#{FFI::Platform::LIBSUFFIX}", __FILE__)
27
27
  end
28
28
 
29
29
 
30
30
  begin
31
31
  # bias the library discovery to a path inside the gem first, then
32
32
  # to the usual system paths
33
-
34
- path_to_internal_libuv = ::File.dirname(__FILE__) + '/../../../ext/libuv/lib'
35
-
36
33
  paths = [
37
- path_to_internal_libuv,
34
+ ::File.expand_path('../', path_to_internal_libuv),
38
35
  '/usr/local/lib',
39
36
  '/opt/local/lib',
40
37
  '/usr/lib64'
@@ -63,16 +60,11 @@ module Libuv
63
60
  end
64
61
 
65
62
 
66
- def self.path_to_internal_libuv
67
- @path_to_internal_libuv ||= ::File.expand_path("../../../../ext/libuv/lib/libuv.#{FFI::Platform::LIBSUFFIX}", __FILE__)
68
- end
69
-
70
-
71
63
  require 'libuv/ext/types'
72
64
 
73
65
 
74
- attach_function :handle_size, :uv_handle_size, [:uv_handle_type], :size_t, :blocking => true
75
- attach_function :req_size, :uv_req_size, [:uv_req_type], :size_t, :blocking => true
66
+ attach_function :handle_size, :uv_handle_size, [:uv_handle_type], :size_t
67
+ attach_function :req_size, :uv_req_size, [:uv_req_type], :size_t
76
68
 
77
69
 
78
70
  # We need to calculate where the FS request data is located using req_size
@@ -89,8 +81,8 @@ module Libuv
89
81
  callback :uv_fs_cb, [FsRequest.by_ref], :void
90
82
 
91
83
 
92
- attach_function :version_number, :uv_version, [], :uint, :blocking => true
93
- attach_function :version_string, :uv_version_string, [], :string, :blocking => true
84
+ attach_function :version_number, :uv_version, [], :uint
85
+ attach_function :version_string, :uv_version_string, [], :string
94
86
 
95
87
  attach_function :loop_new, :uv_loop_new, [], :uv_loop_t, :blocking => true
96
88
  attach_function :loop_delete, :uv_loop_delete, [:uv_loop_t], :void, :blocking => true
@@ -98,18 +90,18 @@ module Libuv
98
90
  attach_function :run, :uv_run, [:uv_loop_t, :uv_run_mode], :int, :blocking => true
99
91
  attach_function :stop, :uv_stop, [:uv_loop_t], :void, :blocking => true
100
92
  attach_function :update_time, :uv_update_time, [:uv_loop_t], :void, :blocking => true
101
- attach_function :now, :uv_now, [:uv_loop_t], :uint64, :blocking => true
93
+ attach_function :now, :uv_now, [:uv_loop_t], :uint64
102
94
 
103
95
  attach_function :backend_timeout, :uv_backend_timeout, [:uv_loop_t], :int, :blocking => true
104
96
  attach_function :backend_fd, :uv_backend_fd, [:uv_loop_t], :int, :blocking => true
105
97
 
106
- attach_function :strerror, :uv_strerror, [:int], :string, :blocking => true
107
- attach_function :err_name, :uv_err_name, [:int], :string, :blocking => true
98
+ attach_function :strerror, :uv_strerror, [:int], :string
99
+ attach_function :err_name, :uv_err_name, [:int], :string
108
100
 
109
- attach_function :ref, :uv_ref, [:uv_handle_t], :void, :blocking => true
110
- attach_function :unref, :uv_unref, [:uv_handle_t], :void, :blocking => true
111
- attach_function :has_ref, :uv_has_ref, [:uv_handle_t], :int, :blocking => true
112
- attach_function :is_active, :uv_is_active, [:uv_handle_t], :int, :blocking => true
101
+ attach_function :ref, :uv_ref, [:uv_handle_t], :void
102
+ attach_function :unref, :uv_unref, [:uv_handle_t], :void
103
+ attach_function :has_ref, :uv_has_ref, [:uv_handle_t], :int
104
+ attach_function :is_active, :uv_is_active, [:uv_handle_t], :int
113
105
  attach_function :walk, :uv_walk, [:uv_loop_t, :uv_walk_cb, :pointer], :void, :blocking => true
114
106
  attach_function :close, :uv_close, [:uv_handle_t, :uv_close_cb], :void, :blocking => true
115
107
  attach_function :is_closing, :uv_is_closing, [:uv_handle_t], :int, :blocking => true
@@ -119,7 +111,7 @@ module Libuv
119
111
  # https://github.com/joyent/libuv/commit/4ca9a363897cfa60f4e2229e4f15ac5abd7fd103
120
112
  # uv_fileno
121
113
 
122
- attach_function :buf_init, :uv_buf_init, [:pointer, :size_t], UvBuf.by_value, :blocking => true
114
+ attach_function :buf_init, :uv_buf_init, [:pointer, :size_t], UvBuf.by_value
123
115
 
124
116
  attach_function :listen, :uv_listen, [:uv_stream_t, :int, :uv_connection_cb], :int, :blocking => true
125
117
  attach_function :accept, :uv_accept, [:uv_stream_t, :uv_stream_t], :int, :blocking => true
@@ -195,8 +187,8 @@ module Libuv
195
187
  attach_function :timer_set_repeat, :uv_timer_set_repeat, [:uv_timer_t, :int64_t], :void, :blocking => true
196
188
  attach_function :timer_get_repeat, :uv_timer_get_repeat, [:uv_timer_t], :int64_t, :blocking => true
197
189
  #:addrinfo
198
- attach_function :getaddrinfo, :uv_getaddrinfo, [:uv_loop_t, :uv_getaddrinfo_t, :uv_getaddrinfo_cb, :string, :string, UvAddrinfo.by_ref], :int, :blocking => true
199
- attach_function :freeaddrinfo, :uv_freeaddrinfo, [UvAddrinfo.by_ref], :void, :blocking => true
190
+ attach_function :getaddrinfo, :uv_getaddrinfo, [:uv_loop_t, :uv_getaddrinfo_t, :uv_getaddrinfo_cb, :string, :string, UvAddrinfo.by_ref], :int
191
+ attach_function :freeaddrinfo, :uv_freeaddrinfo, [UvAddrinfo.by_ref], :void
200
192
 
201
193
  attach_function :spawn, :uv_spawn, [:uv_loop_t, :uv_process_t, :uv_options_t], :int, :blocking => true
202
194
  attach_function :process_kill, :uv_process_kill, [:uv_process_t, :int], :int, :blocking => true
@@ -246,10 +238,10 @@ module Libuv
246
238
 
247
239
  attach_function :fs_event_init, :uv_fs_event_init, [:uv_loop_t, :uv_fs_event_t, :string, :uv_fs_event_cb, :int], :int, :blocking => true
248
240
 
249
- attach_function :ip4_addr, :uv_ip4_addr, [:string, :int, :sockaddr_in4], :int, :blocking => true
250
- attach_function :ip6_addr, :uv_ip6_addr, [:string, :int, :sockaddr_in6], :int, :blocking => true
251
- attach_function :ip4_name, :uv_ip4_name, [:sockaddr_in4, :pointer, :size_t], :int, :blocking => true
252
- attach_function :ip6_name, :uv_ip6_name, [:sockaddr_in6, :pointer, :size_t], :int, :blocking => true
241
+ attach_function :ip4_addr, :uv_ip4_addr, [:string, :int, :sockaddr_in4], :int
242
+ attach_function :ip6_addr, :uv_ip6_addr, [:string, :int, :sockaddr_in6], :int
243
+ attach_function :ip4_name, :uv_ip4_name, [:sockaddr_in4, :pointer, :size_t], :int
244
+ attach_function :ip6_name, :uv_ip6_name, [:sockaddr_in6, :pointer, :size_t], :int
253
245
  #TODO:: attach_function :inet_ntop, :uv_inet_ntop, [:int, :pointer, ]
254
246
  #TODO:: attach_function :uv_inet_pton
255
247
 
@@ -300,4 +292,4 @@ module Libuv
300
292
  define_singleton_method(:"allocate_request_#{request_type}") { LIBC.malloc(request_size) }
301
293
  end
302
294
  end
303
- end
295
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Libuv
2
4
  module Ext
3
5
  class UvFSStat < FFI::Struct
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Libuv
2
4
  module Ext
3
5
  typedef :int, :uv_os_sock_t
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Libuv
2
4
  module Ext
3
5
  typedef :uint32_t, :in_addr_t
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module FFI::Platform
2
4
  def self.ia32?
3
5
  ARCH == "i386"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  file 'ext/libuv/uv.xcodeproj' => 'ext/libuv/build/gyp' do
2
4
  target_arch = 'ia32'if FFI::Platform.ia32?
3
5
  target_arch = 'x64' if FFI::Platform.x64?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  file 'ext/libuv/out' => 'ext/libuv/build/gyp' do
2
4
  target_arch = 'ia32'if FFI::Platform.ia32?
3
5
  target_arch = 'x64' if FFI::Platform.x64?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  file "ext/libuv/Release/libuv.#{FFI::Platform::LIBSUFFIX}" do
2
4
  target_arch = 'ia32'
3
5
  target_arch = 'x64' if FFI::Platform.x64?
@@ -1,5 +1,6 @@
1
- require 'socket' # Addrinfo
1
+ # frozen_string_literal: true
2
2
 
3
+ require 'socket' # Addrinfo
3
4
 
4
5
  module Libuv
5
6
  module Ext
data/lib/libuv/file.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Libuv
2
4
  class File < Q::DeferredPromise
3
5
  include Assertions, Resource, Listener, FsChecks
@@ -20,14 +22,14 @@ module Libuv
20
22
  define_callback function: :on_stat, **fs_params
21
23
 
22
24
 
23
- EOF = "0\r\n\r\n".freeze
24
- CRLF = "\r\n".freeze
25
+ EOF = "0\r\n\r\n"
26
+ CRLF = "\r\n"
25
27
 
26
28
 
27
29
  attr_reader :fileno, :closed
28
30
 
29
31
 
30
- def initialize(thread, path, flags = 0, mode = 0)
32
+ def initialize(thread, path, flags = 0, mode: 0, wait: true, &blk)
31
33
  super(thread, thread.defer)
32
34
 
33
35
  @fileno = -1
@@ -36,21 +38,27 @@ module Libuv
36
38
  @request_refs = {}
37
39
 
38
40
  request = ::Libuv::Ext.allocate_request_fs
39
- pre_check @defer, request, ::Libuv::Ext.fs_open(@loop, request, @path, @flags, @mode, callback(:on_open, request.address))
40
- nil
41
+ pre_check @defer, request, ::Libuv::Ext.fs_open(@reactor, request, @path, @flags, @mode, callback(:on_open, request.address))
42
+
43
+ if block_given?
44
+ self.progress blk
45
+ elsif wait
46
+ @coroutine = @reactor.defer
47
+ co @coroutine.promise
48
+ end
41
49
  end
42
50
 
43
51
  def close
44
52
  @closed = true
45
53
  request = ::Libuv::Ext.allocate_request_fs
46
- pre_check(@defer, request, ::Libuv::Ext.fs_close(@loop.handle, request, @fileno, callback(:on_close, request.address)))
47
- nil # pre-check returns a promise
54
+ pre_check(@defer, request, ::Libuv::Ext.fs_close(@reactor.handle, request, @fileno, callback(:on_close, request.address)))
55
+ self
48
56
  end
49
57
 
50
- def read(length, offset = 0)
58
+ def read(length, offset = 0, wait: true)
51
59
  assert_type(Integer, length, "length must be an Integer")
52
60
  assert_type(Integer, offset, "offset must be an Integer")
53
- deferred = @loop.defer
61
+ deferred = @reactor.defer
54
62
 
55
63
  buffer1 = FFI::MemoryPointer.new(length)
56
64
  buffer = ::Libuv::Ext.buf_init(buffer1, length)
@@ -58,13 +66,14 @@ module Libuv
58
66
 
59
67
  @request_refs[request.address] = [deferred, buffer1]
60
68
 
61
- pre_check(deferred, request, ::Libuv::Ext.fs_read(@loop.handle, request, @fileno, buffer, 1, offset, callback(:on_read, request.address)))
69
+ promise = pre_check(deferred, request, ::Libuv::Ext.fs_read(@reactor.handle, request, @fileno, buffer, 1, offset, callback(:on_read, request.address)))
70
+ wait ? co(promise) : promise
62
71
  end
63
72
 
64
- def write(data, offset = 0)
73
+ def write(data, offset = 0, wait: true)
65
74
  assert_type(String, data, "data must be a String")
66
75
  assert_type(Integer, offset, "offset must be an Integer")
67
- deferred = @loop.defer
76
+ deferred = @reactor.defer
68
77
 
69
78
  length = data.respond_to?(:bytesize) ? data.bytesize : data.size
70
79
 
@@ -74,84 +83,87 @@ module Libuv
74
83
 
75
84
  @request_refs[request.address] = [deferred, buffer1]
76
85
 
77
- pre_check(deferred, request, ::Libuv::Ext.fs_write(@loop.handle, request, @fileno, buffer, 1, offset, callback(:on_write, request.address)))
86
+ respond wait, pre_check(deferred, request, ::Libuv::Ext.fs_write(@reactor.handle, request, @fileno, buffer, 1, offset, callback(:on_write, request.address)))
78
87
  end
79
88
 
80
- def sync
81
- deferred = @loop.defer
89
+ def sync(wait: false)
90
+ deferred = @reactor.defer
82
91
 
83
92
  request = ::Libuv::Ext.allocate_request_fs
84
93
  @request_refs[request.address] = deferred
85
94
 
86
- pre_check deferred, request, ::Libuv::Ext.fs_fsync(@loop.handle, request, @fileno, callback(:on_sync, request.address))
95
+ respond wait, pre_check(deferred, request, ::Libuv::Ext.fs_fsync(@reactor.handle, request, @fileno, callback(:on_sync, request.address)))
87
96
  end
88
97
 
89
- def datasync
90
- deferred = @loop.defer
98
+ def datasync(wait: false)
99
+ deferred = @reactor.defer
91
100
 
92
101
  request = ::Libuv::Ext.allocate_request_fs
93
102
  @request_refs[request.address] = deferred
94
103
 
95
- pre_check deferred, request, ::Libuv::Ext.fs_fdatasync(@loop.handle, request, @fileno, callback(:on_datasync, request.address))
104
+ respond wait, pre_check(deferred, request, ::Libuv::Ext.fs_fdatasync(@reactor.handle, request, @fileno, callback(:on_datasync, request.address)))
96
105
  end
97
106
 
98
- def truncate(offset)
107
+ def truncate(offset, wait: true)
99
108
  assert_type(Integer, offset, "offset must be an Integer")
100
- deferred = @loop.defer
109
+ deferred = @reactor.defer
101
110
 
102
111
  request = ::Libuv::Ext.allocate_request_fs
103
112
  @request_refs[request.address] = deferred
104
113
 
105
- pre_check deferred, request, ::Libuv::Ext.fs_ftruncate(@loop.handle, request, @fileno, offset, callback(:on_truncate, request.address))
114
+ respond wait, pre_check(deferred, request, ::Libuv::Ext.fs_ftruncate(@reactor.handle, request, @fileno, offset, callback(:on_truncate, request.address)))
106
115
  end
107
116
 
108
- def utime(atime, mtime)
117
+ def utime(atime:, mtime:, wait: true)
109
118
  assert_type(Integer, atime, "atime must be an Integer")
110
119
  assert_type(Integer, mtime, "mtime must be an Integer")
111
- deferred = @loop.defer
120
+ deferred = @reactor.defer
112
121
 
113
122
  request = ::Libuv::Ext.allocate_request_fs
114
123
  @request_refs[request.address] = deferred
115
124
 
116
- pre_check deferred, request, ::Libuv::Ext.fs_futime(@loop.handle, request, @fileno, atime, mtime, callback(:on_utime, request.address))
125
+ promise = pre_check deferred, request, ::Libuv::Ext.fs_futime(@reactor.handle, request, @fileno, atime, mtime, callback(:on_utime, request.address))
126
+ wait ? co(promise) : promise
117
127
  end
118
128
 
119
- def chmod(mode)
129
+ def chmod(mode, wait: true)
120
130
  assert_type(Integer, mode, "mode must be an Integer")
121
- deferred = @loop.defer
131
+ deferred = @reactor.defer
122
132
 
123
133
  request = ::Libuv::Ext.allocate_request_fs
124
134
  @request_refs[request.address] = deferred
125
135
 
126
- pre_check deferred, request, ::Libuv::Ext.fs_fchmod(@loop.handle, request, @fileno, mode, callback(:on_chmod, request.address))
136
+ respond wait, pre_check(deferred, request, ::Libuv::Ext.fs_fchmod(@reactor.handle, request, @fileno, mode, callback(:on_chmod, request.address)))
127
137
  end
128
138
 
129
- def chown(uid, gid)
139
+ def chown(uid:, gid:, wait: true)
130
140
  assert_type(Integer, uid, "uid must be an Integer")
131
141
  assert_type(Integer, gid, "gid must be an Integer")
132
- deferred = @loop.defer
142
+ deferred = @reactor.defer
133
143
 
134
144
  request = ::Libuv::Ext.allocate_request_fs
135
145
  @request_refs[request.address] = deferred
136
146
 
137
- pre_check deferred, request, ::Libuv::Ext.fs_fchown(@loop.handle, request, @fileno, uid, gid, callback(:on_chown, request.address))
147
+ respond wait, pre_check(deferred, request, ::Libuv::Ext.fs_fchown(@reactor.handle, request, @fileno, uid, gid, callback(:on_chown, request.address)))
138
148
  end
139
149
 
140
- def send_file(stream, type = :raw, chunk_size = 4096)
150
+ def send_file(stream, using: :raw, chunk_size: 4096, wait: true)
141
151
  @transmit_failure ||= method(:transmit_failure)
142
152
  @transmit_data ||= method(:transmit_data)
143
153
  @start_transmit ||= method(:start_transmit)
144
154
  @next_chunk ||= method(:next_chunk)
145
155
 
146
- @sending_file = @loop.defer
156
+ @sending_file = @reactor.defer
147
157
  @file_stream = stream
148
- @file_stream_type = type
158
+ @file_stream_type = using
149
159
  @file_chunk_size = chunk_size
150
160
  @file_chunk_count = 0
151
161
 
152
- stat.then @start_transmit, @transmit_failure
162
+ stat(wait: false).then @start_transmit, @transmit_failure
153
163
 
154
- @sending_file.promise.finally &method(:clean_up_send)
164
+ promise = @sending_file.promise
165
+ promise.finally &method(:clean_up_send)
166
+ respond wait, promise
155
167
  end
156
168
 
157
169
 
@@ -168,13 +180,13 @@ module Libuv
168
180
  def transmit_data(data)
169
181
  @file_chunk_count += 1
170
182
  if @file_stream_type == :http
171
- resp = ''
183
+ resp = String.new
172
184
  resp << data.bytesize.to_s(16) << CRLF
173
185
  resp << data
174
186
  resp << CRLF
175
187
  data = resp
176
188
  end
177
- @file_stream.write(data).then @next_chunk, @transmit_failure
189
+ @file_stream.write(data, wait: :promise).then @next_chunk, @transmit_failure
178
190
  nil
179
191
  end
180
192
 
@@ -184,7 +196,7 @@ module Libuv
184
196
 
185
197
  if next_offset >= @file_stream_total
186
198
  if @file_stream_type == :http
187
- @file_stream.write(EOF.dup).then(proc {
199
+ @file_stream.write(EOF, wait: :promise).then(proc {
188
200
  @sending_file.resolve(@file_stream_total)
189
201
  }, @transmit_failure)
190
202
  else
@@ -194,7 +206,7 @@ module Libuv
194
206
  if next_offset + next_size > @file_stream_total
195
207
  next_size = @file_stream_total - next_offset
196
208
  end
197
- read(next_size, next_offset).then(@transmit_data, @transmit_failure)
209
+ read(next_size, next_offset, wait: false).then(@transmit_data, @transmit_failure)
198
210
  end
199
211
  nil
200
212
  end
@@ -220,14 +232,19 @@ module Libuv
220
232
  @fileno = req[:result]
221
233
  cleanup(req)
222
234
  @closed = false
223
- @defer.notify(self)
235
+ ::Fiber.new { @defer.notify(self) }.resume
236
+
237
+ if @coroutine
238
+ @coroutine.resolve(nil)
239
+ @coroutine = nil
240
+ end
224
241
  end
225
242
  end
226
243
 
227
244
  def on_close(req)
228
245
  if post_check(req, @defer)
229
246
  cleanup(req)
230
- @defer.resolve(nil)
247
+ ::Fiber.new { @defer.resolve(nil) }.resume
231
248
  end
232
249
  end
233
250
 
@@ -236,7 +253,7 @@ module Libuv
236
253
  if post_check(req, deferred)
237
254
  data = buffer1.read_string(req[:result])
238
255
  cleanup(req)
239
- deferred.resolve(data)
256
+ ::Fiber.new { deferred.resolve(data) }.resume
240
257
  end
241
258
  end
242
259
 
@@ -244,7 +261,7 @@ module Libuv
244
261
  deferred, buffer1 = @request_refs.delete req.to_ptr.address
245
262
  if post_check(req, deferred)
246
263
  cleanup(req)
247
- deferred.resolve(nil)
264
+ ::Fiber.new { deferred.resolve(nil) }.resume
248
265
  end
249
266
  end
250
267
 
@@ -252,7 +269,7 @@ module Libuv
252
269
  deferred = @request_refs.delete req.to_ptr.address
253
270
  if post_check(req, deferred)
254
271
  cleanup(req)
255
- deferred.resolve(nil)
272
+ ::Fiber.new { deferred.resolve(nil) }.resume
256
273
  end
257
274
  end
258
275
 
@@ -260,7 +277,7 @@ module Libuv
260
277
  deferred = @request_refs.delete req.to_ptr.address
261
278
  if post_check(req, deferred)
262
279
  cleanup(req)
263
- deferred.resolve(nil)
280
+ ::Fiber.new { deferred.resolve(nil) }.resume
264
281
  end
265
282
  end
266
283
 
@@ -268,7 +285,7 @@ module Libuv
268
285
  deferred = @request_refs.delete req.to_ptr.address
269
286
  if post_check(req, deferred)
270
287
  cleanup(req)
271
- deferred.resolve(nil)
288
+ ::Fiber.new { deferred.resolve(nil) }.resume
272
289
  end
273
290
  end
274
291
 
@@ -276,7 +293,7 @@ module Libuv
276
293
  deferred = @request_refs.delete req.to_ptr.address
277
294
  if post_check(req, deferred)
278
295
  cleanup(req)
279
- deferred.resolve(nil)
296
+ ::Fiber.new { deferred.resolve(nil) }.resume
280
297
  end
281
298
  end
282
299
 
@@ -284,7 +301,7 @@ module Libuv
284
301
  deferred = @request_refs.delete req.to_ptr.address
285
302
  if post_check(req, deferred)
286
303
  cleanup(req)
287
- deferred.resolve(nil)
304
+ ::Fiber.new { deferred.resolve(nil) }.resume
288
305
  end
289
306
  end
290
307
 
@@ -292,7 +309,7 @@ module Libuv
292
309
  deferred = @request_refs.delete req.to_ptr.address
293
310
  if post_check(req, deferred)
294
311
  cleanup(req)
295
- deferred.resolve(nil)
312
+ ::Fiber.new { deferred.resolve(nil) }.resume
296
313
  end
297
314
  end
298
315
  end