fiber_scheduler 0.9.0 → 0.10.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b809dc12fe4aea6e8bc0bf88eab0405545abd124d7e088f86815f3ddc64ae9f
4
- data.tar.gz: 1443f88deb315b612aefb3702bf307feefa5a32ea04cecb394bc078e27513f01
3
+ metadata.gz: f52317e155b7fcae9a70ec8c93471ce583e818e00bc239581f52db1943aea579
4
+ data.tar.gz: 592b146c29b9448f8948201b94f0f3468973b19dfc7c75b015a7a2167179824f
5
5
  SHA512:
6
- metadata.gz: 4fdb35be7a59a1fba021ecbce10c496e2af16828ab2d76cd22933360322f31fcf6b7f72cfb3bca88588684f51e3445ee66573a05cb480d6b6e1bed4905a49a6e
7
- data.tar.gz: 4f933bdb78178126c8d181bb52806157c13ef1b5d736d2fc202a1a5c6667eb6ce960c48f7c2123fc053454309a2188774c246cb524f52414b7d2dbc1fae9cc5d
6
+ metadata.gz: 40c9a3f67136992e766b6a9424922061debfbf09d07759396c783e53cccfd4adb63d0027cce0a6fd5922427f59c3ad02e93980b3cf7b4cf8fac5e473257dd42c
7
+ data.tar.gz: 51d94ee5f1431bafe2921a12a20238049d51f6415010eace40407e5a373c4e35cf4500848196489b9c2534dc1dab0b8efbe3c7f780c49bcd1e9c1c6f1f6bd0c2
@@ -0,0 +1,49 @@
1
+ class FiberScheduler
2
+ module Compatibility
3
+ def fiber(*args, **opts, &block)
4
+ return super unless Compatibility.internal?
5
+
6
+ # This is `Fiber.schedule` call inside `FiberScheduler { ... }` block.
7
+ if opts[:blocking]
8
+ Fiber.new(blocking: true) {
9
+ Compatibility.set_internal!
10
+ yield
11
+ }.tap(&:resume)
12
+
13
+ elsif opts[:waiting]
14
+ parent = Fiber.current
15
+ finished = false # prevents races
16
+ blocking = false # prevents #unblock-ing a fiber that never blocked
17
+
18
+ # Don't pass *args and **opts to an unknown fiber scheduler class.
19
+ super() do
20
+ Compatibility.set_internal!
21
+ yield
22
+ ensure
23
+ finished = true
24
+ unblock(nil, parent) if blocking
25
+ end
26
+
27
+ unless finished
28
+ blocking = true
29
+ block(nil, nil)
30
+ end
31
+
32
+ else
33
+ # Don't pass *args and **opts to an unknown fiber scheduler class.
34
+ super() do
35
+ Compatibility.set_internal!
36
+ yield
37
+ end
38
+ end
39
+ end
40
+
41
+ def self.set_internal!
42
+ Thread.current[:_fiber_scheduler] = true # Sets a FIBER local var!
43
+ end
44
+
45
+ def self.internal?
46
+ Thread.current[:_fiber_scheduler]
47
+ end
48
+ end
49
+ end
@@ -1,3 +1,3 @@
1
1
  class FiberScheduler
2
- VERSION = "0.9.0".freeze
2
+ VERSION = "0.10.0".freeze
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require "resolv"
2
+ require_relative "fiber_scheduler/compatibility"
2
3
  require_relative "fiber_scheduler/selector"
3
4
  require_relative "fiber_scheduler/timeouts"
4
5
 
@@ -31,33 +32,47 @@ module Kernel
31
32
 
32
33
  # Unknown fiber scheduler class; can't just pass options to
33
34
  # Fiber.schedule, handle each option separately.
34
- elsif blocking
35
- Fiber.new(blocking: true, &block).tap(&:resume)
36
-
37
- elsif waiting
38
- current = Fiber.current
39
- finished = false # prevents races
40
- Fiber.schedule do
41
- block.call
42
- ensure
43
- # Resume waiting parent fiber
44
- finished = true
45
- scheduler.unblock(nil, current)
46
- end
35
+ else
36
+ scheduler.singleton_class.prepend(FiberScheduler::Compatibility)
37
+
38
+ if blocking
39
+ fiber = Fiber.new(blocking: true) do
40
+ FiberScheduler::Compatibility.set_internal!
41
+ yield
42
+ end
43
+ fiber.tap(&:resume)
44
+
45
+ elsif waiting
46
+ parent = Fiber.current
47
+ finished = false # prevents races
48
+ blocking = false # prevents #unblock-ing a fiber that never blocked
49
+
50
+ Fiber.schedule do
51
+ FiberScheduler::Compatibility.set_internal!
52
+ yield
53
+ ensure
54
+ finished = true
55
+ scheduler.unblock(nil, parent) if blocking
56
+ end
47
57
 
48
- if Fiber.blocking?
49
- # In a blocking fiber, which is potentially also a loopo fiber so
50
- # there's nothing we can transfer to. Run other fibers (or just
51
- # block) until waiting fiber finishes.
52
- until finished
53
- scheduler.run_once
58
+ if Fiber.blocking?
59
+ # In a blocking fiber, which is potentially also a loop fiber so
60
+ # there's nothing we can transfer to. Run other fibers (or just
61
+ # block) until waiting fiber finishes.
62
+ until finished
63
+ scheduler.run_once
64
+ end
65
+ elsif !finished
66
+ blocking = true
67
+ scheduler.block(nil, nil)
54
68
  end
69
+
55
70
  else
56
- scheduler.block(nil, nil) unless finished
71
+ Fiber.schedule do
72
+ FiberScheduler::Compatibility.set_internal!
73
+ yield
74
+ end
57
75
  end
58
-
59
- else
60
- Fiber.schedule(&block)
61
76
  end
62
77
  end
63
78
  end
@@ -181,8 +196,8 @@ class FiberScheduler
181
196
  until finished
182
197
  run_once
183
198
  end
184
- else
185
- @selector.transfer unless finished
199
+ elsif !finished
200
+ @selector.transfer
186
201
  end
187
202
 
188
203
  fiber
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fiber_scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruno Sutic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-13 00:00:00.000000000 Z
11
+ date: 2022-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -72,8 +72,8 @@ executables: []
72
72
  extensions: []
73
73
  extra_rdoc_files: []
74
74
  files:
75
- - lib/fiber/scheduler.rb
76
75
  - lib/fiber_scheduler.rb
76
+ - lib/fiber_scheduler/compatibility.rb
77
77
  - lib/fiber_scheduler/selector.rb
78
78
  - lib/fiber_scheduler/timeout.rb
79
79
  - lib/fiber_scheduler/timeouts.rb
@@ -1 +0,0 @@
1
- require_relative "../fiber_scheduler"