libuv 0.11.22 → 0.12.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 +19 -17
  3. data/.gitmodules +3 -3
  4. data/.rspec +1 -1
  5. data/.travis.yml +16 -16
  6. data/Gemfile +4 -4
  7. data/LICENSE +23 -23
  8. data/README.md +89 -89
  9. data/Rakefile +31 -31
  10. data/lib/libuv.rb +54 -54
  11. data/lib/libuv/async.rb +47 -47
  12. data/lib/libuv/check.rb +55 -55
  13. data/lib/libuv/dns.rb +85 -85
  14. data/lib/libuv/error.rb +78 -74
  15. data/lib/libuv/ext/ext.rb +260 -258
  16. data/lib/libuv/ext/platform/darwin_x64.rb +23 -23
  17. data/lib/libuv/ext/platform/linux.rb +7 -7
  18. data/lib/libuv/ext/platform/unix.rb +29 -29
  19. data/lib/libuv/ext/platform/windows.rb +40 -40
  20. data/lib/libuv/ext/tasks.rb +31 -31
  21. data/lib/libuv/ext/tasks/mac.rb +23 -23
  22. data/lib/libuv/ext/tasks/unix.rb +23 -23
  23. data/lib/libuv/ext/tasks/win.rb +14 -14
  24. data/lib/libuv/ext/types.rb +238 -238
  25. data/lib/libuv/file.rb +281 -269
  26. data/lib/libuv/filesystem.rb +232 -232
  27. data/lib/libuv/fs_event.rb +31 -31
  28. data/lib/libuv/handle.rb +85 -85
  29. data/lib/libuv/idle.rb +56 -56
  30. data/lib/libuv/loop.rb +412 -412
  31. data/lib/libuv/mixins/assertions.rb +23 -23
  32. data/lib/libuv/mixins/fs_checks.rb +60 -58
  33. data/lib/libuv/mixins/listener.rb +34 -34
  34. data/lib/libuv/mixins/net.rb +40 -40
  35. data/lib/libuv/mixins/resource.rb +27 -27
  36. data/lib/libuv/mixins/stream.rb +153 -154
  37. data/lib/libuv/pipe.rb +184 -203
  38. data/lib/libuv/prepare.rb +56 -56
  39. data/lib/libuv/signal.rb +51 -51
  40. data/lib/libuv/tcp.rb +334 -334
  41. data/lib/libuv/timer.rb +85 -85
  42. data/lib/libuv/tty.rb +37 -37
  43. data/lib/libuv/udp.rb +240 -240
  44. data/lib/libuv/version.rb +3 -3
  45. data/lib/libuv/work.rb +75 -75
  46. data/libuv.gemspec +56 -56
  47. data/spec/async_spec.rb +61 -60
  48. data/spec/cpu_spec.rb +10 -10
  49. data/spec/defer_spec.rb +980 -980
  50. data/spec/dns_spec.rb +96 -90
  51. data/spec/filesystem_spec.rb +270 -261
  52. data/spec/idle_spec.rb +56 -56
  53. data/spec/pipe_spec.rb +160 -160
  54. data/spec/tcp_spec.rb +271 -267
  55. metadata +64 -51
data/lib/libuv/file.rb CHANGED
@@ -1,270 +1,282 @@
1
- module Libuv
2
- class File < Q::DeferredPromise
3
- include Assertions, Resource, Listener, FsChecks
4
-
5
-
6
- EOF = "0\r\n\r\n".freeze
7
- CRLF = "\r\n".freeze
8
-
9
-
10
- attr_reader :fileno, :closed
11
-
12
-
13
- def initialize(loop, path, flags = 0, mode = 0)
14
- super(loop, loop.defer)
15
-
16
- @fileno = -1
17
- @closed = true
18
- @path, @flags, @mode = path, flags, mode
19
-
20
- request = ::Libuv::Ext.create_request(:uv_fs)
21
- pre_check @defer, request, ::Libuv::Ext.fs_open(@loop, request, @path, @flags, @mode, callback(:on_open))
22
- end
23
-
24
- def close
25
- @closed = true
26
- request = ::Libuv::Ext.create_request(:uv_fs)
27
- pre_check(@defer, request, ::Libuv::Ext.fs_close(@loop.handle, request, @fileno, callback(:on_close)))
28
- end
29
-
30
- def read(length, offset = 0)
31
- assert_type(Integer, length, "length must be an Integer")
32
- assert_type(Integer, offset, "offset must be an Integer")
33
- @read_deferred = @loop.defer
34
-
35
- @read_buffer = FFI::MemoryPointer.new(length)
36
-
37
- request = ::Libuv::Ext.create_request(:uv_fs)
38
- pre_check(@read_deferred, request, ::Libuv::Ext.fs_read(@loop.handle, request, @fileno, @read_buffer, length, offset, callback(:on_read)))
39
- @read_deferred.promise
40
- end
41
-
42
- def write(data, offset = 0)
43
- assert_type(String, data, "data must be a String")
44
- assert_type(Integer, offset, "offset must be an Integer")
45
- @write_deferred = @loop.defer
46
-
47
- length = data.respond_to?(:bytesize) ? data.bytesize : data.size
48
- @write_buffer = FFI::MemoryPointer.from_string(data)
49
-
50
- request = ::Libuv::Ext.create_request(:uv_fs)
51
- pre_check(@write_deferred, request, ::Libuv::Ext.fs_write(@loop.handle, request, @fileno, @write_buffer, length, offset, callback(:on_write)))
52
- @write_deferred.promise
53
- end
54
-
55
- def sync
56
- @sync_deferred = @loop.defer
57
-
58
- request = ::Libuv::Ext.create_request(:uv_fs)
59
- pre_check @sync_deferred, request, ::Libuv::Ext.fs_fsync(@loop.handle, request, @fileno, callback(:on_sync))
60
- @sync_deferred.promise
61
- end
62
-
63
- def datasync
64
- @datasync_deferred = @loop.defer
65
-
66
- request = ::Libuv::Ext.create_request(:uv_fs)
67
- pre_check @datasync_deferred, request, ::Libuv::Ext.fs_fdatasync(@loop.handle, request, @fileno, callback(:on_datasync))
68
- @datasync_deferred.promise
69
- end
70
-
71
- def truncate(offset)
72
- assert_type(Integer, offset, "offset must be an Integer")
73
- @truncate_deferred = @loop.defer
74
-
75
- request = ::Libuv::Ext.create_request(:uv_fs)
76
- pre_check @truncate_deferred, request, ::Libuv::Ext.fs_ftruncate(@loop.handle, request, @fileno, offset, callback(:on_truncate))
77
- @truncate_deferred.promise
78
- end
79
-
80
- def utime(atime, mtime)
81
- assert_type(Integer, atime, "atime must be an Integer")
82
- assert_type(Integer, mtime, "mtime must be an Integer")
83
- @utime_deferred = @loop.defer
84
-
85
- request = ::Libuv::Ext.create_request(:uv_fs)
86
- pre_check @utime_deferred, request, ::Libuv::Ext.fs_futime(@loop.handle, request, @fileno, atime, mtime, callback(:on_utime))
87
- @utime_deferred.promise
88
- end
89
-
90
- def chmod(mode)
91
- assert_type(Integer, mode, "mode must be an Integer")
92
- @chmod_deferred = @loop.defer
93
-
94
- request = ::Libuv::Ext.create_request(:uv_fs)
95
- pre_check @chmod_deferred, request, ::Libuv::Ext.fs_fchmod(@loop.handle, request, @fileno, mode, callback(:on_chmod))
96
- @chmod_deferred.promise
97
- end
98
-
99
- def chown(uid, gid)
100
- assert_type(Integer, uid, "uid must be an Integer")
101
- assert_type(Integer, gid, "gid must be an Integer")
102
- @chown_deferred = @loop.defer
103
-
104
- request = ::Libuv::Ext.create_request(:uv_fs)
105
- pre_check @chown_deferred, request, ::Libuv::Ext.fs_fchown(@loop.handle, request, @fileno, uid, gid, callback(:on_chown))
106
- @chown_deferred.promise
107
- end
108
-
109
- def send_file(stream, type = :raw, chunk_size = 4096)
110
- @transmit_failure ||= method(:transmit_failure)
111
- @transmit_data ||= method(:transmit_data)
112
- @start_transmit ||= method(:start_transmit)
113
- @next_chunk ||= method(:next_chunk)
114
-
115
- @sending_file = @loop.defer
116
- @file_stream = stream
117
- @file_stream_type = type
118
- @file_chunk_size = chunk_size
119
- @file_chunk_count = 0
120
-
121
- stat.then @start_transmit, @transmit_failure
122
-
123
- @sending_file.promise.finally &method(:clean_up_send)
124
- end
125
-
126
-
127
- private
128
-
129
-
130
- ##
131
- # File transmit functions -------------
132
- def start_transmit(stats)
133
- @file_stream_total = stats[:st_size]
134
- next_chunk
135
- end
136
-
137
- def transmit_data(data)
138
- @file_chunk_count += 1
139
- if @file_stream_type == :http
140
- resp = ''
141
- resp << data.bytesize.to_s(16) << CRLF
142
- resp << data
143
- resp << CRLF
144
- data = resp
145
- end
146
- @file_stream.write(data).then @next_chunk, @transmit_failure
147
- nil
148
- end
149
-
150
- def next_chunk(*args)
151
- next_size = @file_chunk_size
152
- next_offset = @file_chunk_size * @file_chunk_count
153
-
154
- if next_offset >= @file_stream_total
155
- if @file_stream_type == :http
156
- @file_stream.write(EOF.dup).then(proc {
157
- @sending_file.resolve(@file_stream_total)
158
- }, @transmit_failure)
159
- else
160
- @sending_file.resolve(@file_stream_total)
161
- end
162
- else
163
- if next_offset + next_size > @file_stream_total
164
- next_size = @file_stream_total - next_offset
165
- end
166
- read(next_size, next_offset).then(@transmit_data, @transmit_failure)
167
- end
168
- nil
169
- end
170
-
171
- def transmit_failure(reason)
172
- @sending_file.reject(reason)
173
- end
174
-
175
- def clean_up_send
176
- @sending_file = nil
177
- @file_stream = nil
178
- @file_stream_type = nil
179
- @file_chunk_size = nil
180
- @file_chunk_count = nil
181
- @file_stream_total = nil
182
- end
183
- # -------------------------------------
184
- ##
185
-
186
-
187
- def on_open(req)
188
- if post_check(req, @defer)
189
- @fileno = req[:result]
190
- cleanup(req)
191
- @closed = false
192
- @defer.notify(self)
193
- end
194
- end
195
-
196
- def on_close(req)
197
- if post_check(req, @defer)
198
- cleanup(req)
199
- @defer.resolve(nil)
200
- end
201
- end
202
-
203
- def on_read(req)
204
- if post_check(req, @read_deferred)
205
- data = @read_buffer.read_string(req[:result])
206
- cleanup(req)
207
- @read_deferred.resolve(data)
208
- end
209
- @read_buffer = nil
210
- @read_deferred = nil
211
- end
212
-
213
- def on_write(req)
214
- if post_check(req, @write_deferred)
215
- cleanup(req)
216
- @write_deferred.resolve(nil)
217
- end
218
- @write_buffer = nil
219
- @write_deferred = nil
220
- end
221
-
222
- def on_sync(req)
223
- if post_check(req, @sync_deferred)
224
- cleanup(req)
225
- @sync_deferred.resolve(nil)
226
- end
227
- @sync_deferred = nil
228
- end
229
-
230
- def on_datasync(req)
231
- if post_check(req, @datasync_deferred)
232
- cleanup(req)
233
- @datasync_deferred.resolve(nil)
234
- end
235
- @datasync_deferred = nil
236
- end
237
-
238
- def on_truncate(req)
239
- if post_check(req, @truncate_deferred)
240
- cleanup(req)
241
- @truncate_deferred.resolve(nil)
242
- end
243
- @truncate_deferred = nil
244
- end
245
-
246
- def on_utime(req)
247
- if post_check(req, @utime_deferred)
248
- cleanup(req)
249
- @utime_deferred.resolve(nil)
250
- end
251
- @utime_deferred = nil
252
- end
253
-
254
- def on_chmod(req)
255
- if post_check(req, @chmod_deferred)
256
- cleanup(req)
257
- @chmod_deferred.resolve(nil)
258
- end
259
- @chmod_deferred = nil
260
- end
261
-
262
- def on_chown(req)
263
- if post_check(req, @chown_deferred)
264
- cleanup(req)
265
- @chown_deferred.resolve(nil)
266
- end
267
- @chown_deferred = nil
268
- end
269
- end
1
+ module Libuv
2
+ class File < Q::DeferredPromise
3
+ include Assertions, Resource, Listener, FsChecks
4
+
5
+
6
+ EOF = "0\r\n\r\n".freeze
7
+ CRLF = "\r\n".freeze
8
+
9
+
10
+ attr_reader :fileno, :closed
11
+
12
+
13
+ def initialize(loop, path, flags = 0, mode = 0)
14
+ super(loop, loop.defer)
15
+
16
+ @fileno = -1
17
+ @closed = true
18
+ @path, @flags, @mode = path, flags, mode
19
+ @request_refs = {}
20
+
21
+ request = ::Libuv::Ext.create_request(:uv_fs)
22
+ pre_check @defer, request, ::Libuv::Ext.fs_open(@loop, request, @path, @flags, @mode, callback(:on_open))
23
+ nil
24
+ end
25
+
26
+ def close
27
+ @closed = true
28
+ request = ::Libuv::Ext.create_request(:uv_fs)
29
+ pre_check(@defer, request, ::Libuv::Ext.fs_close(@loop.handle, request, @fileno, callback(:on_close)))
30
+ nil # pre-check returns a promise
31
+ end
32
+
33
+ def read(length, offset = 0)
34
+ assert_type(Integer, length, "length must be an Integer")
35
+ assert_type(Integer, offset, "offset must be an Integer")
36
+ deferred = @loop.defer
37
+
38
+ buffer1 = FFI::MemoryPointer.new(length)
39
+ buffer = ::Libuv::Ext.buf_init(buffer1, length)
40
+ request = ::Libuv::Ext.create_request(:uv_fs)
41
+
42
+ @request_refs[request.address] = [deferred, buffer1]
43
+
44
+ pre_check(deferred, request, ::Libuv::Ext.fs_read(@loop.handle, request, @fileno, buffer, 1, offset, callback(:on_read)))
45
+ end
46
+
47
+ def write(data, offset = 0)
48
+ assert_type(String, data, "data must be a String")
49
+ assert_type(Integer, offset, "offset must be an Integer")
50
+ deferred = @loop.defer
51
+
52
+ length = data.respond_to?(:bytesize) ? data.bytesize : data.size
53
+
54
+ buffer1 = FFI::MemoryPointer.from_string(data)
55
+ buffer = ::Libuv::Ext.buf_init(buffer1, length)
56
+ request = ::Libuv::Ext.create_request(:uv_fs)
57
+
58
+ @request_refs[request.address] = [deferred, buffer1]
59
+
60
+ pre_check(deferred, request, ::Libuv::Ext.fs_write(@loop.handle, request, @fileno, buffer, 1, offset, callback(:on_write)))
61
+ end
62
+
63
+ def sync
64
+ deferred = @loop.defer
65
+
66
+ request = ::Libuv::Ext.create_request(:uv_fs)
67
+ @request_refs[request.address] = deferred
68
+
69
+ pre_check deferred, request, ::Libuv::Ext.fs_fsync(@loop.handle, request, @fileno, callback(:on_sync))
70
+ end
71
+
72
+ def datasync
73
+ deferred = @loop.defer
74
+
75
+ request = ::Libuv::Ext.create_request(:uv_fs)
76
+ @request_refs[request.address] = deferred
77
+
78
+ pre_check deferred, request, ::Libuv::Ext.fs_fdatasync(@loop.handle, request, @fileno, callback(:on_datasync))
79
+ end
80
+
81
+ def truncate(offset)
82
+ assert_type(Integer, offset, "offset must be an Integer")
83
+ deferred = @loop.defer
84
+
85
+ request = ::Libuv::Ext.create_request(:uv_fs)
86
+ @request_refs[request.address] = deferred
87
+
88
+ pre_check deferred, request, ::Libuv::Ext.fs_ftruncate(@loop.handle, request, @fileno, offset, callback(:on_truncate))
89
+ end
90
+
91
+ def utime(atime, mtime)
92
+ assert_type(Integer, atime, "atime must be an Integer")
93
+ assert_type(Integer, mtime, "mtime must be an Integer")
94
+ deferred = @loop.defer
95
+
96
+ request = ::Libuv::Ext.create_request(:uv_fs)
97
+ @request_refs[request.address] = deferred
98
+
99
+ pre_check deferred, request, ::Libuv::Ext.fs_futime(@loop.handle, request, @fileno, atime, mtime, callback(:on_utime))
100
+ end
101
+
102
+ def chmod(mode)
103
+ assert_type(Integer, mode, "mode must be an Integer")
104
+ deferred = @loop.defer
105
+
106
+ request = ::Libuv::Ext.create_request(:uv_fs)
107
+ @request_refs[request.address] = deferred
108
+
109
+ pre_check deferred, request, ::Libuv::Ext.fs_fchmod(@loop.handle, request, @fileno, mode, callback(:on_chmod))
110
+ end
111
+
112
+ def chown(uid, gid)
113
+ assert_type(Integer, uid, "uid must be an Integer")
114
+ assert_type(Integer, gid, "gid must be an Integer")
115
+ deferred = @loop.defer
116
+
117
+ request = ::Libuv::Ext.create_request(:uv_fs)
118
+ @request_refs[request.address] = deferred
119
+
120
+ pre_check deferred, request, ::Libuv::Ext.fs_fchown(@loop.handle, request, @fileno, uid, gid, callback(:on_chown))
121
+ end
122
+
123
+ def send_file(stream, type = :raw, chunk_size = 4096)
124
+ @transmit_failure ||= method(:transmit_failure)
125
+ @transmit_data ||= method(:transmit_data)
126
+ @start_transmit ||= method(:start_transmit)
127
+ @next_chunk ||= method(:next_chunk)
128
+
129
+ @sending_file = @loop.defer
130
+ @file_stream = stream
131
+ @file_stream_type = type
132
+ @file_chunk_size = chunk_size
133
+ @file_chunk_count = 0
134
+
135
+ stat.then @start_transmit, @transmit_failure
136
+
137
+ @sending_file.promise.finally &method(:clean_up_send)
138
+ end
139
+
140
+
141
+ private
142
+
143
+
144
+ ##
145
+ # File transmit functions -------------
146
+ def start_transmit(stats)
147
+ @file_stream_total = stats[:st_size]
148
+ next_chunk
149
+ end
150
+
151
+ def transmit_data(data)
152
+ @file_chunk_count += 1
153
+ if @file_stream_type == :http
154
+ resp = ''
155
+ resp << data.bytesize.to_s(16) << CRLF
156
+ resp << data
157
+ resp << CRLF
158
+ data = resp
159
+ end
160
+ @file_stream.write(data).then @next_chunk, @transmit_failure
161
+ nil
162
+ end
163
+
164
+ def next_chunk(*args)
165
+ next_size = @file_chunk_size
166
+ next_offset = @file_chunk_size * @file_chunk_count
167
+
168
+ if next_offset >= @file_stream_total
169
+ if @file_stream_type == :http
170
+ @file_stream.write(EOF.dup).then(proc {
171
+ @sending_file.resolve(@file_stream_total)
172
+ }, @transmit_failure)
173
+ else
174
+ @sending_file.resolve(@file_stream_total)
175
+ end
176
+ else
177
+ if next_offset + next_size > @file_stream_total
178
+ next_size = @file_stream_total - next_offset
179
+ end
180
+ read(next_size, next_offset).then(@transmit_data, @transmit_failure)
181
+ end
182
+ nil
183
+ end
184
+
185
+ def transmit_failure(reason)
186
+ @sending_file.reject(reason)
187
+ end
188
+
189
+ def clean_up_send
190
+ @sending_file = nil
191
+ @file_stream = nil
192
+ @file_stream_type = nil
193
+ @file_chunk_size = nil
194
+ @file_chunk_count = nil
195
+ @file_stream_total = nil
196
+ end
197
+ # -------------------------------------
198
+ ##
199
+
200
+
201
+ def on_open(req)
202
+ if post_check(req, @defer)
203
+ @fileno = req[:result]
204
+ cleanup(req)
205
+ @closed = false
206
+ @defer.notify(self)
207
+ end
208
+ end
209
+
210
+ def on_close(req)
211
+ if post_check(req, @defer)
212
+ cleanup(req)
213
+ @defer.resolve(nil)
214
+ end
215
+ end
216
+
217
+ def on_read(req)
218
+ deferred, buffer1 = @request_refs.delete req.to_ptr.address
219
+ if post_check(req, deferred)
220
+ data = buffer1.read_string(req[:result])
221
+ cleanup(req)
222
+ deferred.resolve(data)
223
+ end
224
+ end
225
+
226
+ def on_write(req)
227
+ deferred, buffer1 = @request_refs.delete req.to_ptr.address
228
+ if post_check(req, deferred)
229
+ cleanup(req)
230
+ deferred.resolve(nil)
231
+ end
232
+ end
233
+
234
+ def on_sync(req)
235
+ deferred = @request_refs.delete req.to_ptr.address
236
+ if post_check(req, deferred)
237
+ cleanup(req)
238
+ deferred.resolve(nil)
239
+ end
240
+ end
241
+
242
+ def on_datasync(req)
243
+ deferred = @request_refs.delete req.to_ptr.address
244
+ if post_check(req, deferred)
245
+ cleanup(req)
246
+ deferred.resolve(nil)
247
+ end
248
+ end
249
+
250
+ def on_truncate(req)
251
+ deferred = @request_refs.delete req.to_ptr.address
252
+ if post_check(req, deferred)
253
+ cleanup(req)
254
+ deferred.resolve(nil)
255
+ end
256
+ end
257
+
258
+ def on_utime(req)
259
+ deferred = @request_refs.delete req.to_ptr.address
260
+ if post_check(req, deferred)
261
+ cleanup(req)
262
+ deferred.resolve(nil)
263
+ end
264
+ end
265
+
266
+ def on_chmod(req)
267
+ deferred = @request_refs.delete req.to_ptr.address
268
+ if post_check(req, deferred)
269
+ cleanup(req)
270
+ deferred.resolve(nil)
271
+ end
272
+ end
273
+
274
+ def on_chown(req)
275
+ deferred = @request_refs.delete req.to_ptr.address
276
+ if post_check(req, deferred)
277
+ cleanup(req)
278
+ deferred.resolve(nil)
279
+ end
280
+ end
281
+ end
270
282
  end