1
1
require " fiber"
2
2
require " channel"
3
- require " crystal/scheduler"
4
3
require " crystal/tracing"
5
4
5
+ {% if flag?(:execution_context ) % }
6
+ require " fiber/execution_context"
7
+ {% else % }
8
+ require " crystal/scheduler"
9
+ {% end % }
10
+
6
11
# Blocks the current fiber for the specified number of seconds.
7
12
#
8
13
# While this fiber is waiting this time, other ready-to-execute
@@ -12,25 +17,36 @@ def sleep(seconds : Number) : Nil
12
17
if seconds < 0
13
18
raise ArgumentError .new " Sleep seconds must be positive"
14
19
end
15
-
16
- Crystal ::Scheduler .sleep(seconds.seconds)
20
+ sleep(seconds.seconds)
17
21
end
18
22
19
23
# Blocks the current Fiber for the specified time span.
20
24
#
21
25
# While this fiber is waiting this time, other ready-to-execute
22
26
# fibers might start their execution.
23
27
def sleep (time : Time ::Span ) : Nil
24
- Crystal ::Scheduler .sleep(time)
28
+ Crystal .trace :sched , " sleep" , for: time
29
+
30
+ {% if flag?(:execution_context ) % }
31
+ Fiber .current.resume_event.add(time)
32
+ Fiber ::ExecutionContext .reschedule
33
+ {% else % }
34
+ Crystal ::Scheduler .sleep(time)
35
+ {% end % }
25
36
end
26
37
27
38
# Blocks the current fiber forever.
28
39
#
29
40
# Meanwhile, other ready-to-execute fibers might start their execution.
30
41
def sleep : Nil
31
- Crystal ::Scheduler .reschedule
42
+ {% if flag?(:execution_context ) % }
43
+ Fiber ::ExecutionContext .reschedule
44
+ {% else % }
45
+ Crystal ::Scheduler .reschedule
46
+ {% end % }
32
47
end
33
48
49
+ {% begin % }
34
50
# Spawns a new fiber.
35
51
#
36
52
# NOTE: The newly created fiber doesn't run as soon as spawned.
64
80
# wg.wait
65
81
# ```
66
82
def spawn (* , name : String ? = nil , same_thread = false , & block)
67
- fiber = Fiber .new(name, & block)
68
- Crystal .trace :sched , " spawn" , fiber: fiber
69
- {% if flag?(:preview_mt ) % } fiber.set_current_thread if same_thread {% end % }
70
- fiber.enqueue
71
- fiber
83
+ {% if flag?(:execution_context ) % }
84
+ Fiber ::ExecutionContext ::Scheduler .current.spawn(name: name, same_thread: same_thread, & block)
85
+ {% else % }
86
+ fiber = Fiber .new(name, & block)
87
+ Crystal .trace :sched , " spawn" , fiber: fiber
88
+ {% if flag?(:preview_mt ) % } fiber.set_current_thread if same_thread {% end % }
89
+ fiber.enqueue
90
+ fiber
91
+ {% end % }
72
92
end
93
+ {% end % }
73
94
74
95
# Spawns a fiber by first creating a `Proc`, passing the *call*'s
75
96
# expressions to it, and letting the `Proc` finally invoke the *call*.
0 commit comments