polyphony 0.99 → 0.99.1

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.
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.