polyphony 0.99 → 0.99.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -1
  3. data/.rubocop.yml +3 -3
  4. data/.yardopts +30 -0
  5. data/CHANGELOG.md +4 -0
  6. data/LICENSE +1 -1
  7. data/README.md +63 -29
  8. data/Rakefile +1 -5
  9. data/TODO.md +0 -4
  10. data/docs/{main-concepts/concurrency.md → concurrency.md} +2 -9
  11. data/docs/{main-concepts/design-principles.md → design-principles.md} +3 -9
  12. data/docs/{main-concepts/exception-handling.md → exception-handling.md} +2 -9
  13. data/docs/{main-concepts/extending.md → extending.md} +2 -9
  14. data/docs/faq.md +3 -16
  15. data/docs/{main-concepts/fiber-scheduling.md → fiber-scheduling.md} +1 -9
  16. data/docs/link_rewriter.rb +16 -0
  17. data/docs/{getting-started/overview.md → overview.md} +1 -30
  18. data/docs/{getting-started/tutorial.md → tutorial.md} +3 -28
  19. data/docs/{_posts/2020-07-26-polyphony-0.44.md → whats-new.md} +3 -1
  20. data/examples/adapters/redis_client.rb +3 -2
  21. data/examples/io/echo_server.rb +1 -1
  22. data/examples/io/echo_server_plain_ruby.rb +26 -0
  23. data/ext/polyphony/backend_io_uring.c +154 -9
  24. data/ext/polyphony/backend_io_uring_context.c +21 -12
  25. data/ext/polyphony/backend_io_uring_context.h +12 -7
  26. data/ext/polyphony/backend_libev.c +1 -1
  27. data/ext/polyphony/extconf.rb +24 -8
  28. data/ext/polyphony/fiber.c +79 -2
  29. data/ext/polyphony/io_extensions.c +53 -0
  30. data/ext/polyphony/pipe.c +42 -2
  31. data/ext/polyphony/polyphony.c +345 -31
  32. data/ext/polyphony/polyphony.h +9 -2
  33. data/ext/polyphony/queue.c +181 -0
  34. data/ext/polyphony/ring_buffer.c +0 -1
  35. data/ext/polyphony/runqueue.c +8 -1
  36. data/ext/polyphony/runqueue_ring_buffer.c +13 -0
  37. data/ext/polyphony/runqueue_ring_buffer.h +2 -1
  38. data/ext/polyphony/socket_extensions.c +6 -0
  39. data/ext/polyphony/thread.c +34 -2
  40. data/lib/polyphony/adapters/process.rb +11 -1
  41. data/lib/polyphony/adapters/sequel.rb +1 -1
  42. data/lib/polyphony/core/channel.rb +2 -0
  43. data/lib/polyphony/core/debug.rb +1 -1
  44. data/lib/polyphony/core/global_api.rb +25 -24
  45. data/lib/polyphony/core/resource_pool.rb +7 -6
  46. data/lib/polyphony/core/sync.rb +2 -2
  47. data/lib/polyphony/core/thread_pool.rb +3 -3
  48. data/lib/polyphony/core/timer.rb +8 -8
  49. data/lib/polyphony/extensions/exception.rb +2 -0
  50. data/lib/polyphony/extensions/fiber.rb +15 -13
  51. data/lib/polyphony/extensions/io.rb +127 -5
  52. data/lib/polyphony/extensions/kernel.rb +20 -2
  53. data/lib/polyphony/extensions/openssl.rb +100 -11
  54. data/lib/polyphony/extensions/pipe.rb +103 -7
  55. data/lib/polyphony/extensions/process.rb +13 -1
  56. data/lib/polyphony/extensions/socket.rb +93 -27
  57. data/lib/polyphony/extensions/thread.rb +9 -1
  58. data/lib/polyphony/extensions/timeout.rb +1 -1
  59. data/lib/polyphony/version.rb +2 -1
  60. data/lib/polyphony.rb +27 -7
  61. data/polyphony.gemspec +1 -8
  62. data/test/stress.rb +1 -1
  63. data/test/test_global_api.rb +45 -7
  64. data/test/test_socket.rb +96 -0
  65. data/test/test_timer.rb +5 -5
  66. metadata +17 -40
  67. data/docs/_config.yml +0 -64
  68. data/docs/_includes/head.html +0 -40
  69. data/docs/_includes/title.html +0 -1
  70. data/docs/_sass/custom/custom.scss +0 -10
  71. data/docs/_sass/overrides.scss +0 -0
  72. data/docs/api-reference/exception.md +0 -31
  73. data/docs/api-reference/fiber.md +0 -425
  74. data/docs/api-reference/index.md +0 -9
  75. data/docs/api-reference/io.md +0 -36
  76. data/docs/api-reference/object.md +0 -99
  77. data/docs/api-reference/polyphony-baseexception.md +0 -33
  78. data/docs/api-reference/polyphony-cancel.md +0 -26
  79. data/docs/api-reference/polyphony-moveon.md +0 -24
  80. data/docs/api-reference/polyphony-net.md +0 -20
  81. data/docs/api-reference/polyphony-process.md +0 -28
  82. data/docs/api-reference/polyphony-resourcepool.md +0 -59
  83. data/docs/api-reference/polyphony-restart.md +0 -18
  84. data/docs/api-reference/polyphony-terminate.md +0 -18
  85. data/docs/api-reference/polyphony-threadpool.md +0 -67
  86. data/docs/api-reference/polyphony-throttler.md +0 -77
  87. data/docs/api-reference/polyphony.md +0 -36
  88. data/docs/api-reference/thread.md +0 -88
  89. data/docs/favicon.ico +0 -0
  90. data/docs/getting-started/index.md +0 -10
  91. data/docs/getting-started/installing.md +0 -34
  92. /data/{docs/assets/img → assets}/echo-fibers.svg +0 -0
  93. /data/{docs → assets}/polyphony-logo.png +0 -0
  94. /data/{docs/assets/img → assets}/sleeping-fiber.svg +0 -0
data/test/test_socket.rb CHANGED
@@ -383,3 +383,99 @@ class SSLSocketTest < MiniTest::Test
383
383
  assert_kind_of OpenSSL::SSL::SSLError, errors.first
384
384
  end
385
385
  end
386
+
387
+ class MultishotAcceptTest < MiniTest::Test
388
+ def setup
389
+ skip if !TCPServer.instance_methods(false).include?(:multishot_accept)
390
+ end
391
+
392
+ def start_tcp_server_on_random_port(host = '127.0.0.1')
393
+ port = rand(1100..60000)
394
+ server = TCPServer.new(host, port)
395
+ [port, server]
396
+ rescue Errno::EADDRINUSE
397
+ retry
398
+ end
399
+
400
+ def test_multishot_accept_while_loop
401
+ port, server = start_tcp_server_on_random_port
402
+ server_fiber = spin do
403
+ server.multishot_accept do
404
+ while (socket = server.accept)
405
+ spin do
406
+ while (data = socket.gets(8192))
407
+ socket << data
408
+ end
409
+ end
410
+ end
411
+ end
412
+ end
413
+
414
+ snooze
415
+ client = TCPSocket.new('127.0.0.1', port)
416
+ client.write("1234\n")
417
+ assert_equal "1234\n", client.recv(8192)
418
+ client.close
419
+
420
+ client = TCPSocket.new('127.0.0.1', port)
421
+ client.write("5678\n")
422
+ assert_equal "5678\n", client.recv(8192)
423
+ client.close
424
+
425
+ ensure
426
+ server_fiber&.stop
427
+ server_fiber&.await
428
+ server&.close
429
+ end
430
+
431
+ def spin_client(socket)
432
+ spin do
433
+ while (data = socket.gets(8192))
434
+ socket << data
435
+ end
436
+ end
437
+ end
438
+
439
+ def test_multishot_accept_loop
440
+ port, server = start_tcp_server_on_random_port
441
+ server_fiber = spin do
442
+ server.multishot_accept do
443
+ server.accept_loop { |s| spin_client(s) }
444
+ end
445
+ end
446
+
447
+ snooze
448
+ client = TCPSocket.new('127.0.0.1', port)
449
+ client.write("1234\n")
450
+ assert_equal "1234\n", client.recv(8192)
451
+ client.close
452
+
453
+ client = TCPSocket.new('127.0.0.1', port)
454
+ client.write("5678\n")
455
+ assert_equal "5678\n", client.recv(8192)
456
+ client.close
457
+
458
+ ensure
459
+ server_fiber&.stop
460
+ server_fiber&.await
461
+ server&.close
462
+ end
463
+
464
+ def test_multishot_accept_error
465
+ port, server = start_tcp_server_on_random_port
466
+ error = nil
467
+ server_fiber = spin do
468
+ server.multishot_accept do
469
+ server.accept_loop { |s| spin_client(s) }
470
+ rescue SystemCallError => e
471
+ error = e
472
+ end
473
+ end
474
+ snooze
475
+ server.close
476
+ snooze
477
+ server_fiber.await
478
+ assert_kind_of Errno::EBADF, error
479
+ end
480
+
481
+ end
data/test/test_timer.rb CHANGED
@@ -39,18 +39,18 @@ class TimerMoveOnAfterTest < MiniTest::Test
39
39
  skip unless IS_LINUX
40
40
 
41
41
  t0 = Time.now
42
- v = @timer.move_on_after(0.01, with_value: :moved_on) do
43
- sleep 0.007
42
+ v = @timer.move_on_after(0.1, with_value: :moved_on) do
43
+ sleep 0.07
44
44
  @timer.reset
45
- sleep 0.007
45
+ sleep 0.07
46
46
  @timer.reset
47
- sleep 0.007
47
+ sleep 0.07
48
48
  nil
49
49
  end
50
50
  t1 = Time.now
51
51
 
52
52
  assert_nil v
53
- assert_in_range 0.015..0.04, t1 - t0
53
+ assert_in_range 0.15..0.4, t1 - t0
54
54
  end
55
55
  end
56
56
 
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.99'
4
+ version: 0.99.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-09 00:00:00.000000000 Z
11
+ date: 2023-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -137,58 +137,35 @@ files:
137
137
  - ".gitmodules"
138
138
  - ".rubocop.yml"
139
139
  - ".vscode/launch.json"
140
+ - ".yardopts"
140
141
  - CHANGELOG.md
141
142
  - Gemfile
142
143
  - LICENSE
143
144
  - README.md
144
145
  - Rakefile
145
146
  - TODO.md
147
+ - assets/echo-fibers.svg
148
+ - assets/polyphony-logo.png
149
+ - assets/sleeping-fiber.svg
146
150
  - bin/pdbg
147
151
  - bin/polyphony-debug
148
152
  - bin/stress.rb
149
153
  - bin/test
150
- - docs/_config.yml
151
- - docs/_includes/head.html
152
- - docs/_includes/title.html
153
- - docs/_posts/2020-07-26-polyphony-0.44.md
154
- - docs/_sass/custom/custom.scss
155
- - docs/_sass/overrides.scss
156
154
  - docs/_user-guide/all-about-timers.md
157
155
  - docs/_user-guide/index.md
158
156
  - docs/_user-guide/web-server.md
159
- - docs/api-reference/exception.md
160
- - docs/api-reference/fiber.md
161
- - docs/api-reference/index.md
162
- - docs/api-reference/io.md
163
- - docs/api-reference/object.md
164
- - docs/api-reference/polyphony-baseexception.md
165
- - docs/api-reference/polyphony-cancel.md
166
- - docs/api-reference/polyphony-moveon.md
167
- - docs/api-reference/polyphony-net.md
168
- - docs/api-reference/polyphony-process.md
169
- - docs/api-reference/polyphony-resourcepool.md
170
- - docs/api-reference/polyphony-restart.md
171
- - docs/api-reference/polyphony-terminate.md
172
- - docs/api-reference/polyphony-threadpool.md
173
- - docs/api-reference/polyphony-throttler.md
174
- - docs/api-reference/polyphony.md
175
- - docs/api-reference/thread.md
176
- - docs/assets/img/echo-fibers.svg
177
- - docs/assets/img/sleeping-fiber.svg
157
+ - docs/concurrency.md
158
+ - docs/design-principles.md
159
+ - docs/exception-handling.md
160
+ - docs/extending.md
178
161
  - docs/faq.md
179
- - docs/favicon.ico
180
- - docs/getting-started/index.md
181
- - docs/getting-started/installing.md
182
- - docs/getting-started/overview.md
183
- - docs/getting-started/tutorial.md
162
+ - docs/fiber-scheduling.md
184
163
  - docs/index.md
185
- - docs/main-concepts/concurrency.md
186
- - docs/main-concepts/design-principles.md
187
- - docs/main-concepts/exception-handling.md
188
- - docs/main-concepts/extending.md
189
- - docs/main-concepts/fiber-scheduling.md
164
+ - docs/link_rewriter.rb
190
165
  - docs/main-concepts/index.md
191
- - docs/polyphony-logo.png
166
+ - docs/overview.md
167
+ - docs/tutorial.md
168
+ - docs/whats-new.md
192
169
  - examples/adapters/pg_client.rb
193
170
  - examples/adapters/pg_notify.rb
194
171
  - examples/adapters/pg_pool.rb
@@ -243,6 +220,7 @@ files:
243
220
  - examples/io/echo_client_from_stdin.rb
244
221
  - examples/io/echo_pipe.rb
245
222
  - examples/io/echo_server.rb
223
+ - examples/io/echo_server_plain_ruby.rb
246
224
  - examples/io/echo_server_with_timeout.rb
247
225
  - examples/io/echo_stdin.rb
248
226
  - examples/io/gzip.rb
@@ -789,8 +767,7 @@ licenses:
789
767
  - MIT
790
768
  metadata:
791
769
  source_code_uri: https://github.com/digital-fabric/polyphony
792
- documentation_uri: https://digital-fabric.github.io/polyphony/
793
- homepage_uri: https://digital-fabric.github.io/polyphony/
770
+ documentation_uri: https://www.rubydoc.info/gems/polyphony
794
771
  changelog_uri: https://github.com/digital-fabric/polyphony/blob/master/CHANGELOG.md
795
772
  post_install_message:
796
773
  rdoc_options:
data/docs/_config.yml DELETED
@@ -1,64 +0,0 @@
1
- title: "Polyphony"
2
- description: Fine-grained concurrency for Ruby
3
-
4
- plugins:
5
- - jekyll-remote-theme
6
-
7
- permalink: pretty
8
- remote_theme: pmarsceill/just-the-docs
9
- color_scheme: light
10
-
11
- search_enabled: true
12
- search:
13
- # Split pages into sections that can be searched individually
14
- # Supports 1 - 6, default: 2
15
- heading_level: 2
16
- # Maximum amount of previews per search result
17
- # Default: 3
18
- previews: 3
19
- # Maximum amount of words to display before a matched word in the preview
20
- # Default: 5
21
- preview_words_before: 5
22
- # Maximum amount of words to display after a matched word in the preview
23
- # Default: 10
24
- preview_words_after: 10
25
- # Set the search token separator
26
- # Default: /[\s\-/]+/
27
- # Example: enable support for hyphenated search words
28
- tokenizer_separator: /[\s/]+/
29
- # Display the relative url in search results
30
- # Supports true (default) or false
31
- rel_url: true
32
- # Enable or disable the search button that appears in the bottom right corner of every page
33
- # Supports true or false (default)
34
- button: false
35
-
36
- aux_links:
37
- "Polyphony on GitHub":
38
- - "//github.com/digital-fabric/polyphony"
39
-
40
- # Makes Aux links open in a new tab. Default is false
41
- aux_links_new_tab: false
42
-
43
- # Enable or disable heading anchors
44
- heading_anchors: true
45
-
46
- back_to_top: true
47
- back_to_top_text: "Back to top"
48
-
49
- footer_content: "Copyright &copy; 2020 Sharon Rosner. Distributed by an <a href=\"https://github.com/digital-fabric/polyphony/tree/master/LICENSE\">MIT license.</a>"
50
-
51
- # Footer "Edit this page on GitHub" link text
52
- gh_edit_link: true # show or hide edit this page link
53
- gh_edit_link_text: "Edit this page on GitHub"
54
- gh_edit_repository: "https://github.com/digital-fabric/polyphony" # the github URL for your repo
55
- gh_edit_branch: "master/docs" # the branch that your docs is served from
56
- gh_edit_view_mode: "tree" # "tree" or "edit" if you want the user to jump into the editor immediately
57
-
58
- compress_html:
59
- clippings: all
60
- comments: all
61
- endings: all
62
- startings: []
63
- blanklines: false
64
- profile: false
@@ -1,40 +0,0 @@
1
- <head>
2
- <meta charset="UTF-8">
3
- <meta http-equiv="X-UA-Compatible" content="IE=Edge">
4
-
5
- {% unless site.plugins contains "jekyll-seo-tag" %}
6
- <title>{{ page.title }} - {{ site.title }}</title>
7
-
8
- {% if page.description %}
9
- <meta name="Description" content="{{ page.description }}">
10
- {% endif %}
11
- {% endunless %}
12
-
13
- <link rel="shortcut icon" href="{{ 'polyphony-logo.png' | absolute_url }}" type="image/png">
14
-
15
- <link rel="stylesheet" href="{{ '/assets/css/just-the-docs-default.css' | absolute_url }}">
16
-
17
- {% if site.ga_tracking != nil %}
18
- <script async src="https://www.googletagmanager.com/gtag/js?id={{ site.ga_tracking }}"></script>
19
- <script>
20
- window.dataLayer = window.dataLayer || [];
21
- function gtag(){dataLayer.push(arguments);}
22
- gtag('js', new Date());
23
-
24
- gtag('config', '{{ site.ga_tracking }}'{% unless site.ga_tracking_anonymize_ip == nil %}, { 'anonymize_ip': true }{% endunless %});
25
- </script>
26
-
27
- {% endif %}
28
-
29
- {% if site.search_enabled != false %}
30
- <script type="text/javascript" src="{{ '/assets/js/vendor/lunr.min.js' | absolute_url }}"></script>
31
- {% endif %}
32
- <script type="text/javascript" src="{{ '/assets/js/just-the-docs.js' | absolute_url }}"></script>
33
-
34
- <meta name="viewport" content="width=device-width, initial-scale=1">
35
-
36
- {% seo %}
37
-
38
- {% include head_custom.html %}
39
-
40
- </head>
@@ -1 +0,0 @@
1
- <img src="{{ 'polyphony-logo.png' | absolute_url }}" style="height: 1.5em; margin-right: 0.5em">Polyphony
@@ -1,10 +0,0 @@
1
-
2
- h1.logo-title {
3
- font-size: 42px !important;
4
- font-weight: bold;
5
- }
6
-
7
- h2.logo-title {
8
- margin-top: 0.25em;
9
- margin-bottom: 1em;
10
- }
File without changes
@@ -1,31 +0,0 @@
1
- ---
2
- layout: page
3
- title: ::Exception
4
- parent: API Reference
5
- permalink: /api-reference/exception/
6
- source_url: https://github.com/digital-fabric/polyphony/blob/master/lib/polyphony/extensions/core.rb
7
- ruby_docs_url: https://rubyapi.org/3.0/o/exception
8
- ---
9
- # ::Exception
10
-
11
- [Ruby core Exception documentation](https://rubyapi.org/3.0/o/exception)
12
-
13
- The core `Exception` class is enhanced to provide a better backtrace that takes
14
- into account the fiber hierarchy. In addition, a `source_fiber` attribute allows
15
- tracking the fiber from which an uncaught exception was propagated.
16
-
17
-
18
-
19
- ## Class Methods
20
-
21
- ## Instance methods
22
-
23
- ### #source_fiber → fiber
24
-
25
- Returns the fiber in which the exception occurred. Polyphony sets this attribute
26
- only for uncaught exceptions. Currently this attribute is only used in a
27
- meaningful way for supervising fibers.
28
-
29
- ### #source_fiber=(fiber) → fiber
30
-
31
- Sets the fiber in which the exception occurred.