async-io 1.27.5 → 1.27.6
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/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.
|