polyphony 0.53.2 → 0.54.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d656c0aad868a468632949355b617821b6a66aa4da69a994ea7afbc4af46e97b
4
- data.tar.gz: edc45b184b0b50940925a1a1db56b0106ded10906ca181513e38450bc320e828
3
+ metadata.gz: 7c88e804739b62a55f7647c57e55582d2ae5cf6a73bca55160aa90138b80217a
4
+ data.tar.gz: ecbeb0aeed96a7b6f21f8d41b67195574213b8b01b51bccd0f1bcf59165ab9f6
5
5
  SHA512:
6
- metadata.gz: f346672c82eee4055ec6c8f7fc1103850fd622a031ebf1c096e9ab130e3aa0b37c559d2b2f953f6b1bd721e4421199800fc0de54993a0c802ddadfa873f35030
7
- data.tar.gz: 8273d691c2ed19ca04207380ea99392c7f65fefe6600c4a9bf9cc20a802f41e34b471e3af8d5adccf29c783c2f0c17610896fae2c183ac26b601c34dc27a5ce2
6
+ metadata.gz: 93ff227cab8891c79bc4447c25359df03cd675ada579d13c5dc09d1f18e42fd00ed1b3ce5e433bd5addf83076af3a45c29cdd49ae8cb2cb9f19892cb27a40476
7
+ data.tar.gz: 1e1f39c19d2edbd49406c3a3917848951914c48b81316fff6ff78f381fb7db70b407dc5428b94a45292261e202df1c91da5d4e971ab19ba91e7c96e0bbbb91bc
@@ -26,6 +26,6 @@ jobs:
26
26
  - name: Show Linux kernel version
27
27
  run: uname -r
28
28
  - name: Compile C-extension
29
- run: bundle exec rake compile
29
+ run: POLYPHONY_USE_LIBEV=1 bundle exec rake compile
30
30
  - name: Run tests
31
31
  run: bundle exec rake test
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 0.54.0
2
+
3
+ - Implement Mutex#owned?, #locked? (#50)
4
+ - Fix arity for SSLSocket#peeraddr (#55)
5
+ - Add missing SSLServer#accept_loop method (#53)
6
+ - Fix SSLSocket buffering behaviour
7
+ - Add recv_loop alias for SSLSocket (#54)
8
+
1
9
  ## 0.53.2
2
10
 
3
11
  - Remove `splice` methods on libev backend on non-Linux OS (#43)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- polyphony (0.53.2)
4
+ polyphony (0.54.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -17,6 +17,7 @@ GEM
17
17
  mime-types (~> 3.0)
18
18
  multi_xml (>= 0.5.2)
19
19
  json (2.3.0)
20
+ localhost (1.1.8)
20
21
  method_source (1.0.0)
21
22
  mime-types (3.3.1)
22
23
  mime-types-data (~> 3.2015)
@@ -72,6 +73,7 @@ DEPENDENCIES
72
73
  hiredis (= 0.6.3)
73
74
  http_parser.rb (~> 0.6.0)
74
75
  httparty (= 0.17.1)
76
+ localhost (~> 1.1.4)
75
77
  minitest (= 5.14.4)
76
78
  minitest-reporters (= 1.4.2)
77
79
  msgpack (= 1.4.2)
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+ require 'polyphony'
5
+
6
+ queue = Queue.new
7
+
8
+ 4.times { |i|
9
+ spin_loop {
10
+ job = queue.pop
11
+ puts("worker %d job %s" % [i, job.inspect])
12
+ }
13
+ }
14
+
15
+ (1..10).each do |i|
16
+ queue << "job#{i}"
17
+ end
18
+
19
+ sleep 0.1 until queue.empty?
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+ require 'polyphony'
5
+ require 'localhost/authority'
6
+
7
+ authority = Localhost::Authority.fetch
8
+ opts = {
9
+ reuse_addr: true,
10
+ dont_linger: true,
11
+ secure_context: authority.server_context
12
+ }
13
+
14
+ server = Polyphony::Net.tcp_listen('localhost', 1234, opts)
15
+
16
+ puts 'Serving HTTPS on port 1234'
17
+
18
+ spin_loop(interval: 1) { STDOUT << '.' }
19
+
20
+ # server.accept_loop do |socket|
21
+ while (socket = server.accept)
22
+ spin do
23
+ while (data = socket.gets("\n", 8192))
24
+ if data.chomp.empty?
25
+ socket << "HTTP/1.1 200 OK\nConnection: close\nContent-Length: 4\n\nfoo\n"
26
+ break
27
+ end
28
+ end
29
+ end
30
+ end
@@ -35,6 +35,14 @@ module Polyphony
35
35
  @token = @store.shift
36
36
  @holding_fiber = Fiber.current
37
37
  end
38
+
39
+ def owned?
40
+ @holding_fiber == Fiber.current
41
+ end
42
+
43
+ def locked?
44
+ @holding_fiber
45
+ end
38
46
  end
39
47
 
40
48
  # Implements a fiber-aware ConditionVariable
@@ -3,7 +3,7 @@
3
3
  require 'openssl'
4
4
  require_relative './socket'
5
5
 
6
- # Open ssl socket helper methods (to make it compatible with Socket API)
6
+ # OpenSSL socket helper methods (to make it compatible with Socket API) and overrides
7
7
  class ::OpenSSL::SSL::SSLSocket
8
8
  alias_method :orig_initialize, :initialize
9
9
  def initialize(socket, context = nil)
@@ -23,22 +23,12 @@ class ::OpenSSL::SSL::SSLSocket
23
23
  io.reuse_addr
24
24
  end
25
25
 
26
- alias_method :orig_accept, :accept
27
- def accept
28
- while true
29
- result = accept_nonblock(exception: false)
30
- case result
31
- when :wait_readable then Polyphony.backend_wait_io(io, false)
32
- when :wait_writable then Polyphony.backend_wait_io(io, true)
33
- else
34
- return result
35
- end
36
- end
37
- end
38
-
39
- def accept_loop
40
- while true
41
- yield accept
26
+ def fill_rbuff
27
+ data = self.sysread(BLOCK_SIZE)
28
+ if data
29
+ @rbuffer << data
30
+ else
31
+ @eof = true
42
32
  end
43
33
  end
44
34
 
@@ -84,4 +74,21 @@ class ::OpenSSL::SSL::SSLSocket
84
74
  yield data
85
75
  end
86
76
  end
77
+ alias_method :recv_loop, :read_loop
78
+
79
+ alias_method :orig_peeraddr, :peeraddr
80
+ def peeraddr(_ = nil)
81
+ orig_peeraddr
82
+ end
83
+ end
84
+
85
+ # OpenSSL socket helper methods (to make it compatible with Socket API) and overrides
86
+ class ::OpenSSL::SSL::SSLServer
87
+ def accept_loop(ignore_errors = true)
88
+ loop do
89
+ yield accept
90
+ rescue SystemCallError, StandardError => e
91
+ raise e unless ignore_errors
92
+ end
93
+ end
87
94
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Polyphony
4
- VERSION = '0.53.2'
4
+ VERSION = '0.54.0'
5
5
  end
data/polyphony.gemspec CHANGED
@@ -37,6 +37,7 @@ Gem::Specification.new do |s|
37
37
  s.add_development_dependency 'mysql2', '0.5.3'
38
38
  s.add_development_dependency 'sequel', '5.34.0'
39
39
  s.add_development_dependency 'httparty', '0.17.1'
40
+ s.add_development_dependency 'localhost', '~>1.1.4'
40
41
 
41
42
  # s.add_development_dependency 'jekyll', '~>3.8.6'
42
43
  # s.add_development_dependency 'jekyll-remote-theme', '~>0.4.1'
data/test/test_sync.rb CHANGED
@@ -70,4 +70,47 @@ class MutexTest < MiniTest::Test
70
70
  Fiber.current.await_all_children
71
71
  assert_equal [:bar, :foo], buf
72
72
  end
73
+
74
+ def test_owned?
75
+ buf = []
76
+ lock = Polyphony::Mutex.new
77
+ (1..3).each do |i|
78
+ spin do
79
+ lock.synchronize do
80
+ buf << ">> #{i}"
81
+ buf << [i, lock.owned?]
82
+ sleep(rand * 0.05)
83
+ buf << "<< #{i}"
84
+ end
85
+ buf << [i, lock.owned?]
86
+ end
87
+ end
88
+
89
+ Fiber.current.await_all_children
90
+ assert_equal ['>> 1', [1, true], '<< 1', [1, false], '>> 2', [2, true], '<< 2', [2, false], '>> 3', [3, true], '<< 3', [3, false]], buf
91
+ end
92
+
93
+ def test_locked?
94
+ lock = Polyphony::Mutex.new
95
+ a = spin do
96
+ sender = receive
97
+ lock.synchronize do
98
+ sender << 'pong'
99
+ receive
100
+ end
101
+ sender << 'pong'
102
+ end
103
+
104
+ snooze
105
+ assert !lock.locked?
106
+ a << Fiber.current
107
+
108
+ receive
109
+ assert lock.locked?
110
+
111
+ a << Fiber.current
112
+
113
+ receive
114
+ assert !lock.locked?
115
+ end
73
116
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyphony
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.53.2
4
+ version: 0.54.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-10 00:00:00.000000000 Z
11
+ date: 2021-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -226,6 +226,20 @@ dependencies:
226
226
  - - '='
227
227
  - !ruby/object:Gem::Version
228
228
  version: 0.17.1
229
+ - !ruby/object:Gem::Dependency
230
+ name: localhost
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: 1.1.4
236
+ type: :development
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: 1.1.4
229
243
  description:
230
244
  email: sharon@noteflakes.com
231
245
  executables: []
@@ -313,6 +327,7 @@ files:
313
327
  - examples/core/interrupt.rb
314
328
  - examples/core/nested.rb
315
329
  - examples/core/pingpong.rb
330
+ - examples/core/queue.rb
316
331
  - examples/core/recurrent-timer.rb
317
332
  - examples/core/resource_delegate.rb
318
333
  - examples/core/spin.rb
@@ -336,6 +351,7 @@ files:
336
351
  - examples/io/echo_stdin.rb
337
352
  - examples/io/happy-eyeballs.rb
338
353
  - examples/io/httparty.rb
354
+ - examples/io/https_server.rb
339
355
  - examples/io/irb.rb
340
356
  - examples/io/net-http.rb
341
357
  - examples/io/open.rb