Skip to content

Commit 9ce6b0f

Browse files
committed
fix(lev_fiber): forbid reset if wheel is off
Signed-off-by: Rudi Grinberg <me@rgrinberg.com>
1 parent 3f3a296 commit 9ce6b0f

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

lev-fiber/src/lev_fiber.ml

+22-19
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ module Timer = struct
127127
ivar : [ `Ok | `Cancelled ] Fiber.Ivar.t;
128128
scheduled : Lev.Timestamp.t;
129129
mutable filled : bool;
130-
wheel : running;
130+
wheel : t;
131131
}
132132

133133
and running = {
@@ -169,8 +169,8 @@ module Timer = struct
169169
Fiber.of_thunk (fun () ->
170170
match !t with
171171
| Stopped -> Code_error.raise "Wheel.task" []
172-
| Running t ->
173-
let now = Lev.Loop.now t.scheduler.loop in
172+
| Running wheel ->
173+
let now = Lev.Loop.now wheel.scheduler.loop in
174174
let data =
175175
{
176176
wheel = t;
@@ -179,26 +179,29 @@ module Timer = struct
179179
filled = false;
180180
}
181181
in
182-
let res = Removable_queue.push t.queue data in
183-
let+ () = wakeup_if_waiting t in
182+
let res = Removable_queue.push wheel.queue data in
183+
let+ () = wakeup_if_waiting wheel in
184184
ref res)
185185

186186
let reset (task : task) =
187187
Fiber.of_thunk (fun () ->
188188
let task' = Removable_queue.data !task in
189-
Removable_queue.remove !task;
190-
let now = Lev.Loop.now task'.wheel.scheduler.loop in
191-
let filled = task'.filled in
192-
let task' =
193-
let task' = { task' with scheduled = now } in
194-
if filled then (
195-
task'.filled <- false;
196-
{ task' with ivar = Fiber.Ivar.create () })
197-
else task'
198-
in
199-
let new_task = Removable_queue.push task'.wheel.queue task' in
200-
task := new_task;
201-
if filled then wakeup_if_waiting task'.wheel else Fiber.return ())
189+
match !(task'.wheel) with
190+
| Stopped -> Code_error.raise "reset: wheel is stopped" []
191+
| Running wheel ->
192+
Removable_queue.remove !task;
193+
let now = Lev.Loop.now wheel.scheduler.loop in
194+
let filled = task'.filled in
195+
let task' =
196+
let task' = { task' with scheduled = now } in
197+
if filled then (
198+
task'.filled <- false;
199+
{ task' with ivar = Fiber.Ivar.create () })
200+
else task'
201+
in
202+
let new_task = Removable_queue.push wheel.queue task' in
203+
task := new_task;
204+
if filled then wakeup_if_waiting wheel else Fiber.return ())
202205

203206
let await (task : task) =
204207
Fiber.of_thunk (fun () ->
@@ -243,7 +246,7 @@ module Timer = struct
243246
Queue.push r.scheduler.queue (Fiber.Fill (task.ivar, `Ok)));
244247
Fiber.return ())
245248
else
246-
let scheduler = task.wheel.scheduler in
249+
let scheduler = r.scheduler in
247250
let ivar = Fiber.Ivar.create () in
248251
let timer =
249252
Lev.Timer.create ~after (fun timer ->

0 commit comments

Comments
 (0)