polyphony 0.44.0 → 0.45.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -1
  3. data/CHANGELOG.md +7 -0
  4. data/Gemfile.lock +9 -11
  5. data/Rakefile +1 -1
  6. data/TODO.md +12 -7
  7. data/docs/_posts/2020-07-26-polyphony-0.44.md +77 -0
  8. data/docs/api-reference/thread.md +1 -1
  9. data/docs/getting-started/overview.md +14 -14
  10. data/docs/getting-started/tutorial.md +1 -1
  11. data/examples/core/{xx-agent.rb → xx-backend.rb} +5 -5
  12. data/examples/io/xx-pry.rb +18 -0
  13. data/examples/io/xx-rack_server.rb +71 -0
  14. data/examples/performance/thread-vs-fiber/polyphony_server_read_loop.rb +1 -1
  15. data/ext/polyphony/backend.h +41 -0
  16. data/ext/polyphony/event.c +3 -3
  17. data/ext/polyphony/extconf.rb +1 -1
  18. data/ext/polyphony/{libev_agent.c → libev_backend.c} +175 -175
  19. data/ext/polyphony/polyphony.c +1 -1
  20. data/ext/polyphony/polyphony.h +4 -4
  21. data/ext/polyphony/polyphony_ext.c +2 -2
  22. data/ext/polyphony/queue.c +2 -2
  23. data/ext/polyphony/thread.c +21 -21
  24. data/lib/polyphony.rb +13 -12
  25. data/lib/polyphony/adapters/irb.rb +2 -17
  26. data/lib/polyphony/adapters/mysql2.rb +1 -1
  27. data/lib/polyphony/adapters/postgres.rb +5 -5
  28. data/lib/polyphony/adapters/process.rb +2 -2
  29. data/lib/polyphony/adapters/readline.rb +17 -0
  30. data/lib/polyphony/adapters/sequel.rb +1 -1
  31. data/lib/polyphony/core/global_api.rb +11 -6
  32. data/lib/polyphony/core/resource_pool.rb +2 -2
  33. data/lib/polyphony/core/sync.rb +38 -2
  34. data/lib/polyphony/core/throttler.rb +1 -1
  35. data/lib/polyphony/extensions/core.rb +31 -20
  36. data/lib/polyphony/extensions/fiber.rb +1 -1
  37. data/lib/polyphony/extensions/io.rb +7 -8
  38. data/lib/polyphony/extensions/openssl.rb +6 -6
  39. data/lib/polyphony/extensions/socket.rb +4 -14
  40. data/lib/polyphony/extensions/thread.rb +6 -5
  41. data/lib/polyphony/version.rb +1 -1
  42. data/polyphony.gemspec +4 -3
  43. data/test/helper.rb +1 -1
  44. data/test/{test_agent.rb → test_backend.rb} +22 -22
  45. data/test/test_fiber.rb +4 -4
  46. data/test/test_io.rb +1 -1
  47. data/test/test_kernel.rb +5 -0
  48. data/test/test_signal.rb +3 -3
  49. data/test/test_sync.rb +52 -0
  50. metadata +40 -30
  51. data/.gitbook.yaml +0 -4
  52. data/ext/polyphony/agent.h +0 -41
@@ -352,7 +352,7 @@ class FiberTest < MiniTest::Test
352
352
  result = []
353
353
  f = Fiber.current.spin do
354
354
  result << :start
355
- result << Thread.current.agent.sleep(1)
355
+ result << Thread.current.backend.sleep(1)
356
356
  end
357
357
  snooze
358
358
  f.interrupt
@@ -641,7 +641,7 @@ class FiberTest < MiniTest::Test
641
641
  end
642
642
  end
643
643
  sleep 0.1
644
- f = spin { Thread.current.agent.waitpid(pid) }
644
+ f = spin { Thread.current.backend.waitpid(pid) }
645
645
  o.close
646
646
  Process.kill('INT', pid)
647
647
  f.await
@@ -663,7 +663,7 @@ class FiberTest < MiniTest::Test
663
663
  end
664
664
  end
665
665
  sleep 0.2
666
- f = spin { Thread.current.agent.waitpid(pid) }
666
+ f = spin { Thread.current.backend.waitpid(pid) }
667
667
  o.close
668
668
  Process.kill('TERM', pid)
669
669
  f.await
@@ -690,7 +690,7 @@ class FiberTest < MiniTest::Test
690
690
  sleep 0.2
691
691
  Process.kill('TERM', pid)
692
692
  end
693
- Thread.current.agent.waitpid(pid)
693
+ Thread.current.backend.waitpid(pid)
694
694
  klass = i.read
695
695
  i.close
696
696
  assert_equal 'Polyphony::Terminate', klass
@@ -55,7 +55,7 @@ class IOTest < MiniTest::Test
55
55
  results << result
56
56
  case result
57
57
  when :wait_readable
58
- Thread.current.agent.wait_io(i, false)
58
+ Thread.current.backend.wait_io(i, false)
59
59
  else
60
60
  break result
61
61
  end
@@ -19,6 +19,11 @@ class KernelTest < MiniTest::Test
19
19
  timer&.stop
20
20
  end
21
21
 
22
+ def test_Kernel_system_singleton_method
23
+ assert_equal true, Kernel.system("which ruby > /dev/null 2>&1")
24
+ assert_equal false, Kernel.system("which rruubbyy > /dev/null 2>&1")
25
+ end
26
+
22
27
  def patch_open3
23
28
  class << Open3
24
29
  alias_method :orig_popen2, :popen2
@@ -23,7 +23,7 @@ class SignalTrapTest < Minitest::Test
23
23
  sleep 0.01
24
24
  o.close
25
25
  Process.kill('INT', pid)
26
- Thread.current.agent.waitpid(pid)
26
+ Thread.current.backend.waitpid(pid)
27
27
  buffer = i.read
28
28
  assert_equal "3-interrupt\n", buffer
29
29
  end
@@ -51,7 +51,7 @@ class SignalTrapTest < Minitest::Test
51
51
  sleep 0.02
52
52
  o.close
53
53
  Process.kill('INT', pid)
54
- Thread.current.agent.waitpid(pid)
54
+ Thread.current.backend.waitpid(pid)
55
55
  buffer = i.read
56
56
  assert_equal "3 - interrupted\n2 - terminated\n1 - terminated\n", buffer
57
57
  end
@@ -69,7 +69,7 @@ class SignalTrapTest < Minitest::Test
69
69
  o.close
70
70
  sleep 0.1
71
71
  Process.kill('INT', pid)
72
- Thread.current.agent.waitpid(pid)
72
+ Thread.current.backend.waitpid(pid)
73
73
  buffer = i.read
74
74
  assert_equal "3-interrupt\n", buffer
75
75
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helper'
4
+
5
+ class MutexTest < MiniTest::Test
6
+ def test_mutex
7
+ buf = []
8
+ lock = Polyphony::Mutex.new
9
+ (1..3).each do |i|
10
+ spin do
11
+ lock.synchronize do
12
+ buf << ">> #{i}"
13
+ sleep(rand * 0.05)
14
+ buf << "<< #{i}"
15
+ end
16
+ end
17
+ end
18
+
19
+ Fiber.current.await_all_children
20
+ assert_equal ['>> 1', '<< 1', '>> 2', '<< 2', '>> 3', '<< 3'], buf
21
+ end
22
+
23
+ def test_condition_variable
24
+ buf = []
25
+ lock1 = Polyphony::Mutex.new
26
+ lock2 = Polyphony::Mutex.new
27
+ cond = Polyphony::ConditionVariable.new
28
+
29
+ spin do
30
+ lock1.synchronize do
31
+ sleep 0.01
32
+ cond.wait(lock1)
33
+ lock2.synchronize do
34
+ buf << :foo
35
+ end
36
+ end
37
+ end
38
+
39
+ spin do
40
+ lock2.synchronize do
41
+ sleep 0.01
42
+ lock1.synchronize do
43
+ buf << :bar
44
+ end
45
+ cond.signal
46
+ end
47
+ end
48
+
49
+ Fiber.current.await_all_children
50
+ assert_equal [:bar, :foo], buf
51
+ end
52
+ end
metadata CHANGED
@@ -1,43 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyphony
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.44.0
4
+ version: 0.45.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: 2020-07-25 00:00:00.000000000 Z
11
+ date: 2020-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: httparty
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '='
18
- - !ruby/object:Gem::Version
19
- version: 0.17.0
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - '='
25
- - !ruby/object:Gem::Version
26
- version: 0.17.0
27
- - !ruby/object:Gem::Dependency
28
- name: localhost
14
+ name: rake-compiler
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - '='
32
18
  - !ruby/object:Gem::Version
33
- version: 1.1.4
19
+ version: 1.0.5
34
20
  type: :development
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - '='
39
25
  - !ruby/object:Gem::Version
40
- version: 1.1.4
26
+ version: 1.0.5
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: minitest
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -95,33 +81,33 @@ dependencies:
95
81
  - !ruby/object:Gem::Version
96
82
  version: 0.85.1
97
83
  - !ruby/object:Gem::Dependency
98
- name: pg
84
+ name: pry
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
87
  - - '='
102
88
  - !ruby/object:Gem::Version
103
- version: 1.1.4
89
+ version: 0.13.1
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
94
  - - '='
109
95
  - !ruby/object:Gem::Version
110
- version: 1.1.4
96
+ version: 0.13.1
111
97
  - !ruby/object:Gem::Dependency
112
- name: rake-compiler
98
+ name: pg
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
101
  - - '='
116
102
  - !ruby/object:Gem::Version
117
- version: 1.0.5
103
+ version: 1.1.4
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - '='
123
109
  - !ruby/object:Gem::Version
124
- version: 1.0.5
110
+ version: 1.1.4
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: redis
127
113
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +150,26 @@ dependencies:
164
150
  - - "~>"
165
151
  - !ruby/object:Gem::Version
166
152
  version: 0.6.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: rack
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: 2.0.8
160
+ - - "<"
161
+ - !ruby/object:Gem::Version
162
+ version: 2.3.0
163
+ type: :development
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: 2.0.8
170
+ - - "<"
171
+ - !ruby/object:Gem::Version
172
+ version: 2.3.0
167
173
  - !ruby/object:Gem::Dependency
168
174
  name: mysql2
169
175
  requirement: !ruby/object:Gem::Requirement
@@ -256,7 +262,6 @@ extensions:
256
262
  extra_rdoc_files:
257
263
  - README.md
258
264
  files:
259
- - ".gitbook.yaml"
260
265
  - ".github/workflows/test.yml"
261
266
  - ".gitignore"
262
267
  - ".rubocop.yml"
@@ -273,6 +278,7 @@ files:
273
278
  - docs/_config.yml
274
279
  - docs/_includes/head.html
275
280
  - docs/_includes/title.html
281
+ - docs/_posts/2020-07-26-polyphony-0.44.md
276
282
  - docs/_sass/custom/custom.scss
277
283
  - docs/_sass/overrides.scss
278
284
  - docs/_user-guide/all-about-timers.md
@@ -327,8 +333,8 @@ files:
327
333
  - examples/core/02-awaiting-fibers.rb
328
334
  - examples/core/03-interrupting.rb
329
335
  - examples/core/04-handling-signals.rb
330
- - examples/core/xx-agent.rb
331
336
  - examples/core/xx-at_exit.rb
337
+ - examples/core/xx-backend.rb
332
338
  - examples/core/xx-caller.rb
333
339
  - examples/core/xx-channels.rb
334
340
  - examples/core/xx-daemon.rb
@@ -380,6 +386,8 @@ files:
380
386
  - examples/io/xx-irb.rb
381
387
  - examples/io/xx-net-http.rb
382
388
  - examples/io/xx-open.rb
389
+ - examples/io/xx-pry.rb
390
+ - examples/io/xx-rack_server.rb
383
391
  - examples/io/xx-switch.rb
384
392
  - examples/io/xx-system.rb
385
393
  - examples/io/xx-tcpserver.rb
@@ -419,13 +427,13 @@ files:
419
427
  - ext/libev/ev_win32.c
420
428
  - ext/libev/ev_wrap.h
421
429
  - ext/libev/test_libev_win32.c
422
- - ext/polyphony/agent.h
430
+ - ext/polyphony/backend.h
423
431
  - ext/polyphony/event.c
424
432
  - ext/polyphony/extconf.rb
425
433
  - ext/polyphony/fiber.c
426
434
  - ext/polyphony/libev.c
427
435
  - ext/polyphony/libev.h
428
- - ext/polyphony/libev_agent.c
436
+ - ext/polyphony/libev_backend.c
429
437
  - ext/polyphony/polyphony.c
430
438
  - ext/polyphony/polyphony.h
431
439
  - ext/polyphony/polyphony_ext.c
@@ -440,6 +448,7 @@ files:
440
448
  - lib/polyphony/adapters/mysql2.rb
441
449
  - lib/polyphony/adapters/postgres.rb
442
450
  - lib/polyphony/adapters/process.rb
451
+ - lib/polyphony/adapters/readline.rb
443
452
  - lib/polyphony/adapters/redis.rb
444
453
  - lib/polyphony/adapters/sequel.rb
445
454
  - lib/polyphony/adapters/trace.rb
@@ -465,7 +474,7 @@ files:
465
474
  - test/q.rb
466
475
  - test/run.rb
467
476
  - test/stress.rb
468
- - test/test_agent.rb
477
+ - test/test_backend.rb
469
478
  - test/test_event.rb
470
479
  - test/test_ext.rb
471
480
  - test/test_fiber.rb
@@ -478,6 +487,7 @@ files:
478
487
  - test/test_signal.rb
479
488
  - test/test_socket.rb
480
489
  - test/test_supervise.rb
490
+ - test/test_sync.rb
481
491
  - test/test_thread.rb
482
492
  - test/test_thread_pool.rb
483
493
  - test/test_throttler.rb
@@ -1,4 +0,0 @@
1
- root: ./docs/
2
- structure:
3
- readme: ./README.md
4
- summary: ./summary.md
@@ -1,41 +0,0 @@
1
- #ifndef AGENT_H
2
- #define AGENT_H
3
-
4
- #include "ruby.h"
5
-
6
- // agent interface function signatures
7
-
8
- // VALUE LibevAgent_accept(VALUE self, VALUE sock);
9
- // VALUE LibevAgent_accept_loop(VALUE self, VALUE sock);
10
- // VALUE libev_agent_await(VALUE self);
11
- // VALUE LibevAgent_connect(VALUE self, VALUE sock, VALUE host, VALUE port);
12
- // VALUE LibevAgent_finalize(VALUE self);
13
- // VALUE LibevAgent_post_fork(VALUE self);
14
- // VALUE LibevAgent_read(VALUE self, VALUE io, VALUE str, VALUE length, VALUE to_eof);
15
- // VALUE LibevAgent_read_loop(VALUE self, VALUE io);
16
- // VALUE LibevAgent_sleep(VALUE self, VALUE duration);
17
- // VALUE LibevAgent_wait_io(VALUE self, VALUE io, VALUE write);
18
- // VALUE LibevAgent_wait_pid(VALUE self, VALUE pid);
19
- // VALUE LibevAgent_write(int argc, VALUE *argv, VALUE self);
20
-
21
- typedef VALUE (* agent_pending_count_t)(VALUE self);
22
- typedef VALUE (*agent_poll_t)(VALUE self, VALUE nowait, VALUE current_fiber, VALUE queue);
23
- typedef VALUE (* agent_ref_t)(VALUE self);
24
- typedef int (* agent_ref_count_t)(VALUE self);
25
- typedef void (* agent_reset_ref_count_t)(VALUE self);
26
- typedef VALUE (* agent_unref_t)(VALUE self);
27
- typedef VALUE (* agent_wait_event_t)(VALUE self, VALUE raise_on_exception);
28
- typedef VALUE (* agent_wakeup_t)(VALUE self);
29
-
30
- typedef struct agent_interface {
31
- agent_pending_count_t pending_count;
32
- agent_poll_t poll;
33
- agent_ref_t ref;
34
- agent_ref_count_t ref_count;
35
- agent_reset_ref_count_t reset_ref_count;
36
- agent_unref_t unref;
37
- agent_wait_event_t wait_event;
38
- agent_wakeup_t wakeup;
39
- } agent_interface_t;
40
-
41
- #endif /* AGENT_H */