async-io 1.28.0 → 1.31.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/lib/async/io/host_endpoint.rb +1 -1
  3. data/lib/async/io/peer.rb +2 -2
  4. data/lib/async/io/socket.rb +2 -2
  5. data/lib/async/io/ssl_socket.rb +2 -4
  6. data/lib/async/io/stream.rb +2 -2
  7. data/lib/async/io/tcp_socket.rb +1 -1
  8. data/{spec/async/io/socket/udp_spec.rb → lib/async/io/threads.rb} +56 -36
  9. data/lib/async/io/trap.rb +8 -3
  10. data/lib/async/io/version.rb +1 -1
  11. metadata +45 -94
  12. data/.editorconfig +0 -6
  13. data/.gitignore +0 -13
  14. data/.rspec +0 -3
  15. data/.travis.yml +0 -26
  16. data/.yardopts +0 -2
  17. data/Gemfile +0 -13
  18. data/README.md +0 -171
  19. data/async-io.gemspec +0 -30
  20. data/examples/allocations/byteslice.rb +0 -29
  21. data/examples/allocations/memory.rb +0 -16
  22. data/examples/allocations/read_chunks.rb +0 -18
  23. data/examples/chat/client.rb +0 -58
  24. data/examples/chat/server.rb +0 -83
  25. data/examples/defer/worker.rb +0 -29
  26. data/examples/echo/client.rb +0 -23
  27. data/examples/echo/server.rb +0 -58
  28. data/examples/issues/broken_ssl.rb +0 -15
  29. data/examples/issues/pipes.rb +0 -34
  30. data/examples/millions/client.rb +0 -44
  31. data/examples/millions/server.rb +0 -41
  32. data/examples/udp/client.rb +0 -14
  33. data/examples/udp/server.rb +0 -16
  34. data/gems/nio4r-2.3.gemfile +0 -3
  35. data/spec/addrinfo.rb +0 -16
  36. data/spec/async/io/buffer_spec.rb +0 -48
  37. data/spec/async/io/c10k_spec.rb +0 -138
  38. data/spec/async/io/echo_spec.rb +0 -75
  39. data/spec/async/io/endpoint_spec.rb +0 -105
  40. data/spec/async/io/generic_examples.rb +0 -73
  41. data/spec/async/io/generic_spec.rb +0 -107
  42. data/spec/async/io/notification_spec.rb +0 -46
  43. data/spec/async/io/protocol/line_spec.rb +0 -81
  44. data/spec/async/io/shared_endpoint/server_spec.rb +0 -72
  45. data/spec/async/io/shared_endpoint_spec.rb +0 -65
  46. data/spec/async/io/socket/tcp_spec.rb +0 -101
  47. data/spec/async/io/socket_spec.rb +0 -149
  48. data/spec/async/io/ssl_server_spec.rb +0 -133
  49. data/spec/async/io/ssl_socket_spec.rb +0 -96
  50. data/spec/async/io/standard_spec.rb +0 -47
  51. data/spec/async/io/stream_context.rb +0 -30
  52. data/spec/async/io/stream_spec.rb +0 -337
  53. data/spec/async/io/tcp_socket_spec.rb +0 -84
  54. data/spec/async/io/trap_spec.rb +0 -52
  55. data/spec/async/io/udp_socket_spec.rb +0 -56
  56. data/spec/async/io/unix_endpoint_spec.rb +0 -106
  57. data/spec/async/io/unix_socket_spec.rb +0 -66
  58. data/spec/async/io/wrap/http_rb_spec.rb +0 -47
  59. data/spec/async/io/wrap/tcp_spec.rb +0 -79
  60. data/spec/spec_helper.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d3efc5254f6ca150d428d1a13eeaf36775c9a7f0fe3f3859069eb30db4d6b907
4
- data.tar.gz: 287aa5c3bd8e31304a3d60a7f278bd48307224aa457b67ec766d9c160731a37c
3
+ metadata.gz: a4bd452ecb8105b456fde28d2af79a2d4b360bac0cad9e7e35cc4f71c6c852d1
4
+ data.tar.gz: b629d8aed875e23295b8ab01da8b22c5f02a5fc79775a8afddae032531557d73
5
5
  SHA512:
6
- metadata.gz: e8be3b2eb8024ebcea499eafe4845415684ab56a7a952141ef4cccb0e91fb7cde2f439734cb4a126051e9de3f349eb15ee59e65f55292d8705cd900c6ebfca4e
7
- data.tar.gz: 9b46e1c7eb93a45e72cd5b0698b57213f31b4f8fc23c546f0bf887fd1e0cc17c9978fa03adb52f58cffb8a4b53df87bb16a514d02b676d7913102e57bac11df8
6
+ metadata.gz: b905369d33bf79d557dcaee2a68ad24979295d64a746e7d05ae182a2cd00abba3db1c8d93e86e4eda525468ef3875adeb747cee9d95439e20a0246c49d9255f3
7
+ data.tar.gz: 5dba169bd0668e39aba12df17e53ee2f70a211be0b41e5fc6a9b5a1f0e59336b29ac534b67f40014410c70355753bc92be1951929bd6a36df9a166764e5a9c88
@@ -77,7 +77,7 @@ module Async
77
77
  # @yield [Socket] the bound socket
78
78
  # @return [Array<Socket>] an array of bound sockets
79
79
  def bind(&block)
80
- Addrinfo.foreach(*@specification).collect do |address|
80
+ Addrinfo.foreach(*@specification).map do |address|
81
81
  Socket.bind(address, **@options, &block)
82
82
  end
83
83
  end
data/lib/async/io/peer.rb CHANGED
@@ -59,13 +59,13 @@ module Async
59
59
  when 0, IPPROTO_TCP
60
60
  self.setsockopt(IPPROTO_TCP, TCP_NODELAY, value ? 1 : 0)
61
61
  else
62
- Async.logger.warn(self) {"Unsure how to sync=#{value} for #{self.protocol}!"}
62
+ Console.logger.warn(self) {"Unsure how to sync=#{value} for #{self.protocol}!"}
63
63
  end
64
64
  rescue Errno::EINVAL
65
65
  # On Darwin, sometimes occurs when the connection is not yet fully formed. Empirically, TCP_NODELAY is enabled despite this result.
66
66
  rescue Errno::EOPNOTSUPP
67
67
  # Some platforms may simply not support the operation.
68
- # Async.logger.warn(self) {"Unable to set sync=#{value}!"}
68
+ # Console.logger.warn(self) {"Unable to set sync=#{value}!"}
69
69
  end
70
70
 
71
71
  def sync
@@ -116,7 +116,7 @@ module Async
116
116
  # @param remote_address [Address] The remote address to connect to.
117
117
  # @option local_address [Address] The local address to bind to before connecting.
118
118
  def self.connect(remote_address, local_address: nil, task: Task.current, **options)
119
- Async.logger.debug(self) {"Connecting to #{remote_address.inspect}"}
119
+ Console.logger.debug(self) {"Connecting to #{remote_address.inspect}"}
120
120
 
121
121
  task.annotate "connecting to #{remote_address.inspect}"
122
122
 
@@ -154,7 +154,7 @@ module Async
154
154
  # @param local_address [Address] The local address to bind to.
155
155
  # @option protocol [Integer] The socket protocol to use.
156
156
  def self.bind(local_address, protocol: 0, task: Task.current, **options, &block)
157
- Async.logger.debug(self) {"Binding to #{local_address.inspect}"}
157
+ Console.logger.debug(self) {"Binding to #{local_address.inspect}"}
158
158
 
159
159
  wrapper = build(local_address.afamily, local_address.socktype, protocol, **options) do |socket|
160
160
  socket.bind(local_address.to_sockaddr)
@@ -30,7 +30,7 @@ module Async
30
30
 
31
31
  # Asynchronous TCP socket wrapper.
32
32
  class SSLSocket < Generic
33
- wraps OpenSSL::SSL::SSLSocket, :alpn_protocol, :cert, :cipher, :client_ca, :context, :getsockopt, :hostname, :hostname=, :npn_protocol, :peer_cert, :peer_cert_chain, :pending, :post_connection_check, :setsockopt, :session, :session=, :session_reused?, :ssl_version, :state, :sync_close, :sync_close=, :sysclose, :verify_result, :tmp_key
33
+ wraps OpenSSL::SSL::SSLSocket, :alpn_protocol, :cert, :cipher, :client_ca, :context, :finished_message, :peer_finished_message, :getsockopt, :hostname, :hostname=, :npn_protocol, :peer_cert, :peer_cert_chain, :pending, :post_connection_check, :setsockopt, :session, :session=, :session_reused?, :ssl_version, :state, :sync_close, :sync_close=, :sysclose, :verify_result, :tmp_key
34
34
 
35
35
  wrap_blocking_method :accept, :accept_nonblock
36
36
  wrap_blocking_method :connect, :connect_nonblock
@@ -68,6 +68,7 @@ module Async
68
68
  super
69
69
  else
70
70
  io = self.class.wrapped_klass.new(socket.to_io, context)
71
+ super(io, socket.reactor)
71
72
 
72
73
  # We detach the socket from the reactor, otherwise it's possible to add the file descriptor to the selector twice, which is bad.
73
74
  socket.reactor = nil
@@ -75,10 +76,7 @@ module Async
75
76
  # This ensures that when the internal IO is closed, it also closes the internal socket:
76
77
  io.sync_close = true
77
78
 
78
- # Copy the timeout:
79
79
  @timeout = socket.timeout
80
-
81
- super(io, socket.reactor)
82
80
  end
83
81
  end
84
82
 
@@ -259,13 +259,13 @@ module Async
259
259
 
260
260
  if @read_buffer.empty?
261
261
  if @io.read_nonblock(size, @read_buffer, exception: false)
262
- # Async.logger.debug(self, name: "read") {@read_buffer.inspect}
262
+ # Console.logger.debug(self, name: "read") {@read_buffer.inspect}
263
263
  return true
264
264
  end
265
265
  else
266
266
  if chunk = @io.read_nonblock(size, @input_buffer, exception: false)
267
267
  @read_buffer << chunk
268
- # Async.logger.debug(self, name: "read") {@read_buffer.inspect}
268
+ # Console.logger.debug(self, name: "read") {@read_buffer.inspect}
269
269
 
270
270
  return true
271
271
  end
@@ -40,7 +40,7 @@ module Async
40
40
  # We do this unusual dance to avoid leaking an "open" socket instance.
41
41
  socket = Socket.connect(remote_address, local_address: local_address)
42
42
  fd = socket.fcntl(Fcntl::F_DUPFD)
43
- Async.logger.debug(self) {"Connected to #{remote_address.inspect}: #{fd}"}
43
+ Console.logger.debug(self) {"Connected to #{remote_address.inspect}: #{fd}"}
44
44
  socket.close
45
45
 
46
46
  super(::TCPSocket.for_fd(fd))
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright, 2017, by Samuel G. D. Williams. <http://www.codeotaku.com>
3
+ # Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
4
  #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the "Software"), to deal
@@ -20,44 +20,64 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
21
  # THE SOFTWARE.
22
22
 
23
- require 'async/io/udp_socket'
23
+ require_relative 'notification'
24
24
 
25
- RSpec.describe Async::IO::Socket do
26
- include_context Async::RSpec::Reactor
27
-
28
- # Shared port for localhost network tests.
29
- let(:server_address) {Async::IO::Address.udp("127.0.0.1", 6778)}
30
- let(:data) {"The quick brown fox jumped over the lazy dog."}
31
-
32
- let!(:server_task) do
33
- reactor.async do
34
- Async::IO::Socket.bind(server_address) do |server|
35
- packet, address = server.recvfrom(512)
36
-
37
- server.send(packet, 0, address)
25
+ module Async
26
+ module IO
27
+ class Threads
28
+ def initialize(parent: nil)
29
+ @parent = parent
38
30
  end
39
- end
40
- end
41
-
42
- describe 'basic udp server' do
43
- it "should echo data back to peer" do
44
- reactor.async do
45
- Async::IO::Socket.connect(server_address) do |client|
46
- client.send(data)
47
- response = client.recv(512)
48
-
49
- expect(response).to be == data
31
+
32
+ if Async::Scheduler.supported?
33
+ def async(parent: (@parent or Task.current))
34
+ parent.async do
35
+ thread = ::Thread.new do
36
+ yield
37
+ end
38
+
39
+ thread.join
40
+ rescue Stop
41
+ if thread&.alive?
42
+ thread.raise(Stop)
43
+ end
44
+
45
+ begin
46
+ thread.join
47
+ rescue Stop
48
+ # Ignore.
49
+ end
50
+ end
50
51
  end
51
- end
52
- end
53
-
54
- it "should use unconnected socket" do
55
- reactor.async do
56
- Async::IO::UDPSocket.wrap(server_address.afamily) do |client|
57
- client.send(data, 0, server_address)
58
- response, address = client.recvfrom(512)
59
-
60
- expect(response).to be == data
52
+ else
53
+ def async(parent: (@parent or Task.current))
54
+ parent.async do |task|
55
+ notification = Async::IO::Notification.new
56
+
57
+ thread = ::Thread.new do
58
+ yield
59
+ ensure
60
+ notification.signal
61
+ end
62
+
63
+ task.annotate "Waiting for thread to finish..."
64
+
65
+ notification.wait
66
+
67
+ thread.value
68
+ ensure
69
+ if thread&.alive?
70
+ thread.raise(Stop)
71
+
72
+ begin
73
+ thread.join
74
+ rescue Stop
75
+ # Ignore.
76
+ end
77
+ end
78
+
79
+ notification&.close
80
+ end
61
81
  end
62
82
  end
63
83
  end
data/lib/async/io/trap.rb CHANGED
@@ -36,6 +36,10 @@ module Async
36
36
  @mutex = Mutex.new
37
37
  end
38
38
 
39
+ def to_s
40
+ "\#<#{self.class} #{@name}>"
41
+ end
42
+
39
43
  # Ignore the trap within the current process. Can be invoked before forking and/or invoking `install!` to assert default behaviour.
40
44
  def ignore!
41
45
  Signal.trap(@name, :IGNORE)
@@ -87,9 +91,10 @@ module Async
87
91
  # Deprecated.
88
92
  alias trap wait
89
93
 
90
- def async(parent: Task.current, &block)
91
- parent.async do |task|
92
- self.trap(task: task, &block)
94
+ # In order to avoid blocking the reactor, specify `transient: true` as an option.
95
+ def async(parent: Task.current, **options, &block)
96
+ parent.async(**options) do |task|
97
+ self.wait(task: task, &block)
93
98
  end
94
99
  end
95
100
 
@@ -22,6 +22,6 @@
22
22
 
23
23
  module Async
24
24
  module IO
25
- VERSION = "1.28.0"
25
+ VERSION = "1.31.0"
26
26
  end
27
27
  end
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.28.0
4
+ version: 1.31.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-31 00:00:00.000000000 Z
11
+ date: 2021-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: async-container
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.15'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.15'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: async-rspec
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -39,21 +53,35 @@ dependencies:
39
53
  - !ruby/object:Gem::Version
40
54
  version: '1.10'
41
55
  - !ruby/object:Gem::Dependency
42
- name: async-container
56
+ name: bake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - "~>"
59
+ - - ">="
46
60
  - !ruby/object:Gem::Version
47
- version: '0.15'
61
+ version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - "~>"
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
- version: '0.15'
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
- name: covered
70
+ name: bake-bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bake-modernize
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - ">="
@@ -81,7 +109,7 @@ dependencies:
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
- name: bake-bundler
112
+ name: covered
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
115
  - - ">="
@@ -108,36 +136,12 @@ dependencies:
108
136
  - - "~>"
109
137
  - !ruby/object:Gem::Version
110
138
  version: '3.0'
111
- description:
139
+ description:
112
140
  email:
113
- - samuel.williams@oriontransfer.co.nz
114
141
  executables: []
115
142
  extensions: []
116
143
  extra_rdoc_files: []
117
144
  files:
118
- - ".editorconfig"
119
- - ".gitignore"
120
- - ".rspec"
121
- - ".travis.yml"
122
- - ".yardopts"
123
- - Gemfile
124
- - README.md
125
- - async-io.gemspec
126
- - examples/allocations/byteslice.rb
127
- - examples/allocations/memory.rb
128
- - examples/allocations/read_chunks.rb
129
- - examples/chat/client.rb
130
- - examples/chat/server.rb
131
- - examples/defer/worker.rb
132
- - examples/echo/client.rb
133
- - examples/echo/server.rb
134
- - examples/issues/broken_ssl.rb
135
- - examples/issues/pipes.rb
136
- - examples/millions/client.rb
137
- - examples/millions/server.rb
138
- - examples/udp/client.rb
139
- - examples/udp/server.rb
140
- - gems/nio4r-2.3.gemfile
141
145
  - lib/async/io.rb
142
146
  - lib/async/io/address.rb
143
147
  - lib/async/io/address_endpoint.rb
@@ -160,49 +164,23 @@ files:
160
164
  - lib/async/io/standard.rb
161
165
  - lib/async/io/stream.rb
162
166
  - lib/async/io/tcp_socket.rb
167
+ - lib/async/io/threads.rb
163
168
  - lib/async/io/trap.rb
164
169
  - lib/async/io/udp_socket.rb
165
170
  - lib/async/io/unix_endpoint.rb
166
171
  - lib/async/io/unix_socket.rb
167
172
  - lib/async/io/version.rb
168
- - spec/addrinfo.rb
169
- - spec/async/io/buffer_spec.rb
170
- - spec/async/io/c10k_spec.rb
171
- - spec/async/io/echo_spec.rb
172
- - spec/async/io/endpoint_spec.rb
173
- - spec/async/io/generic_examples.rb
174
- - spec/async/io/generic_spec.rb
175
- - spec/async/io/notification_spec.rb
176
- - spec/async/io/protocol/line_spec.rb
177
- - spec/async/io/shared_endpoint/server_spec.rb
178
- - spec/async/io/shared_endpoint_spec.rb
179
- - spec/async/io/socket/tcp_spec.rb
180
- - spec/async/io/socket/udp_spec.rb
181
- - spec/async/io/socket_spec.rb
182
- - spec/async/io/ssl_server_spec.rb
183
- - spec/async/io/ssl_socket_spec.rb
184
- - spec/async/io/standard_spec.rb
185
- - spec/async/io/stream_context.rb
186
- - spec/async/io/stream_spec.rb
187
- - spec/async/io/tcp_socket_spec.rb
188
- - spec/async/io/trap_spec.rb
189
- - spec/async/io/udp_socket_spec.rb
190
- - spec/async/io/unix_endpoint_spec.rb
191
- - spec/async/io/unix_socket_spec.rb
192
- - spec/async/io/wrap/http_rb_spec.rb
193
- - spec/async/io/wrap/tcp_spec.rb
194
- - spec/spec_helper.rb
195
173
  homepage: https://github.com/socketry/async-io
196
174
  licenses:
197
175
  - MIT
198
176
  metadata: {}
199
- post_install_message:
177
+ post_install_message:
200
178
  rdoc_options: []
201
179
  require_paths:
202
180
  - lib
203
181
  required_ruby_version: !ruby/object:Gem::Requirement
204
182
  requirements:
205
- - - "~>"
183
+ - - ">="
206
184
  - !ruby/object:Gem::Version
207
185
  version: '2.5'
208
186
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -211,35 +189,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
189
  - !ruby/object:Gem::Version
212
190
  version: '0'
213
191
  requirements: []
214
- rubygems_version: 3.1.2
215
- signing_key:
192
+ rubygems_version: 3.2.3
193
+ signing_key:
216
194
  specification_version: 4
217
195
  summary: Provides support for asynchonous TCP, UDP, UNIX and SSL sockets.
218
- test_files:
219
- - spec/addrinfo.rb
220
- - spec/async/io/buffer_spec.rb
221
- - spec/async/io/c10k_spec.rb
222
- - spec/async/io/echo_spec.rb
223
- - spec/async/io/endpoint_spec.rb
224
- - spec/async/io/generic_examples.rb
225
- - spec/async/io/generic_spec.rb
226
- - spec/async/io/notification_spec.rb
227
- - spec/async/io/protocol/line_spec.rb
228
- - spec/async/io/shared_endpoint/server_spec.rb
229
- - spec/async/io/shared_endpoint_spec.rb
230
- - spec/async/io/socket/tcp_spec.rb
231
- - spec/async/io/socket/udp_spec.rb
232
- - spec/async/io/socket_spec.rb
233
- - spec/async/io/ssl_server_spec.rb
234
- - spec/async/io/ssl_socket_spec.rb
235
- - spec/async/io/standard_spec.rb
236
- - spec/async/io/stream_context.rb
237
- - spec/async/io/stream_spec.rb
238
- - spec/async/io/tcp_socket_spec.rb
239
- - spec/async/io/trap_spec.rb
240
- - spec/async/io/udp_socket_spec.rb
241
- - spec/async/io/unix_endpoint_spec.rb
242
- - spec/async/io/unix_socket_spec.rb
243
- - spec/async/io/wrap/http_rb_spec.rb
244
- - spec/async/io/wrap/tcp_spec.rb
245
- - spec/spec_helper.rb
196
+ test_files: []