async-io 1.27.5 → 1.27.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/lib/async/io/generic.rb +1 -1
- data/lib/async/io/stream.rb +18 -6
- data/lib/async/io/version.rb +1 -1
- data/spec/async/io/stream_spec.rb +19 -0
- metadata +3 -4
- data/Rakefile +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e0bff7f13a902bd5ef577d7a36d067f482c4d02001dfe1111ef83cb549187fd
|
4
|
+
data.tar.gz: 80aa5c4aaf1da1f1fe9df08779f9be5e03168b4ba42a3a8e83b19c3b4b5205f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a6cd691bc26134513232ae20b4d7c38c7807fe697360537a690fd504099b825e546c6be4cd7fbb50d50164f55d46a02a0a5986a1ee97b64673342442886cf84
|
7
|
+
data.tar.gz: cf04dd4be38376c52b76c88233b5de97b58e7dc4ce14cac2a9d68824dc5489db3e192fb0d29bb8101d15a2172ffce66be51e9914a8b22b65807cd17a8cb4f583
|
data/Gemfile
CHANGED
data/lib/async/io/generic.rb
CHANGED
@@ -29,7 +29,7 @@ module Async
|
|
29
29
|
BLOCK_SIZE = ENV.fetch('ASYNC_IO_BLOCK_SIZE', 1024*64).to_i
|
30
30
|
|
31
31
|
# The maximum read size when appending to IO buffers. Defaults to 8MB.
|
32
|
-
MAXIMUM_READ_SIZE = ENV.fetch('ASYNC_IO_MAXIMUM_READ_SIZE', BLOCK_SIZE * 128
|
32
|
+
MAXIMUM_READ_SIZE = ENV.fetch('ASYNC_IO_MAXIMUM_READ_SIZE', BLOCK_SIZE * 128).to_i
|
33
33
|
|
34
34
|
# Convert a Ruby ::IO object to a wrapped instance:
|
35
35
|
def self.try_convert(io, &block)
|
data/lib/async/io/stream.rb
CHANGED
@@ -48,6 +48,7 @@ module Async
|
|
48
48
|
|
49
49
|
@deferred = deferred
|
50
50
|
@pending = 0
|
51
|
+
|
51
52
|
@writing = Async::Semaphore.new(1)
|
52
53
|
|
53
54
|
# We don't want Ruby to do any IO buffering.
|
@@ -154,7 +155,6 @@ module Async
|
|
154
155
|
if @pending == 1
|
155
156
|
task.yield
|
156
157
|
drain_write_buffer unless @write_buffer.empty?
|
157
|
-
@pending = 0
|
158
158
|
end
|
159
159
|
else
|
160
160
|
drain_write_buffer unless @write_buffer.empty?
|
@@ -245,18 +245,29 @@ module Async
|
|
245
245
|
|
246
246
|
def drain_write_buffer
|
247
247
|
@writing.acquire do
|
248
|
-
Async.logger.debug(self) do
|
248
|
+
Async.logger.debug(self) do |buffer|
|
249
249
|
if @pending > 0
|
250
|
-
"Draining #{@pending} writes (#{@write_buffer.bytesize} bytes)..."
|
250
|
+
buffer.puts "Draining #{@pending} writes (#{@write_buffer.bytesize} bytes)..."
|
251
251
|
else
|
252
|
-
"Draining immediate write (#{@write_buffer.bytesize} bytes)..."
|
252
|
+
buffer.puts "Draining immediate write (#{@write_buffer.bytesize} bytes)..."
|
253
253
|
end
|
254
|
+
|
255
|
+
# buffer.puts "@write_buffer = #{@write_buffer.inspect}"
|
256
|
+
# buffer.puts "@drain_buffer = #{@drain_buffer.inspect}"
|
254
257
|
end
|
255
258
|
|
259
|
+
# Flip the write buffer and drain buffer:
|
256
260
|
@write_buffer, @drain_buffer = @drain_buffer, @write_buffer
|
257
261
|
|
258
|
-
|
259
|
-
@
|
262
|
+
# The write buffer no longer contains pending writes:
|
263
|
+
@pending = 0
|
264
|
+
|
265
|
+
begin
|
266
|
+
@io.write(@drain_buffer)
|
267
|
+
ensure
|
268
|
+
# If the write operation fails, we still need to clear this buffer, and the data is essentially lost.
|
269
|
+
@drain_buffer.clear
|
270
|
+
end
|
260
271
|
end
|
261
272
|
end
|
262
273
|
|
@@ -281,6 +292,7 @@ module Async
|
|
281
292
|
if chunk = @io.read_nonblock(size, @input_buffer, exception: false)
|
282
293
|
@read_buffer << chunk
|
283
294
|
# Async.logger.debug(self, name: "read") {@read_buffer.inspect}
|
295
|
+
|
284
296
|
return true
|
285
297
|
end
|
286
298
|
end
|
data/lib/async/io/version.rb
CHANGED
@@ -77,6 +77,25 @@ RSpec.describe Async::IO::Stream do
|
|
77
77
|
expect(buffer).to be == (buffer[0] * buffer_size)
|
78
78
|
end
|
79
79
|
end
|
80
|
+
|
81
|
+
it "handles write failures" do
|
82
|
+
subject.close
|
83
|
+
|
84
|
+
task = reactor.async do
|
85
|
+
output.write("Hello World")
|
86
|
+
output.flush(deferred: true)
|
87
|
+
end
|
88
|
+
|
89
|
+
expect do
|
90
|
+
task.wait
|
91
|
+
end.to raise_error(Errno::EPIPE)
|
92
|
+
|
93
|
+
write_buffer = output.instance_variable_get(:@write_buffer)
|
94
|
+
drain_buffer = output.instance_variable_get(:@drain_buffer)
|
95
|
+
|
96
|
+
expect(write_buffer).to be_empty
|
97
|
+
expect(drain_buffer).to be_empty
|
98
|
+
end
|
80
99
|
end
|
81
100
|
|
82
101
|
describe '#close_read' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async-io
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.27.
|
4
|
+
version: 1.27.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-03-
|
11
|
+
date: 2020-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
@@ -122,7 +122,6 @@ files:
|
|
122
122
|
- ".yardopts"
|
123
123
|
- Gemfile
|
124
124
|
- README.md
|
125
|
-
- Rakefile
|
126
125
|
- async-io.gemspec
|
127
126
|
- examples/allocations/byteslice.rb
|
128
127
|
- examples/allocations/memory.rb
|
@@ -212,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
212
211
|
- !ruby/object:Gem::Version
|
213
212
|
version: '0'
|
214
213
|
requirements: []
|
215
|
-
rubygems_version: 3.
|
214
|
+
rubygems_version: 3.0.6
|
216
215
|
signing_key:
|
217
216
|
specification_version: 4
|
218
217
|
summary: Provides support for asynchonous TCP, UDP, UNIX and SSL sockets.
|