forked from Mirror/wren
Revise low level fiber semantics to play nicer with schedulers.
Now that I'm starting to write a real async scheduler on top of Wren's basic fiber API, I have a better feel for what it needs. It turns out run() is not it. - Remove run() methods. - Add transfer() which leaves the caller of the invoked fiber alone. - Add suspend() to return control to the host application. - Add Timer.schedule() to start a new independently scheduled fiber. - Change Timer.sleep() so that it only transfers control to explicitly scheduled fibers, not any one.
This commit is contained in:
24
test/core/fiber/transfer.wren
Normal file
24
test/core/fiber/transfer.wren
Normal file
@ -0,0 +1,24 @@
|
||||
var a = Fiber.new {
|
||||
IO.print("a")
|
||||
}
|
||||
|
||||
var b = Fiber.new {
|
||||
IO.print("b before")
|
||||
a.transfer()
|
||||
IO.print("b after")
|
||||
}
|
||||
|
||||
var c = Fiber.new {
|
||||
IO.print("c before")
|
||||
b.transfer()
|
||||
IO.print("c after")
|
||||
}
|
||||
|
||||
IO.print("start") // expect: start
|
||||
|
||||
c.transfer()
|
||||
// expect: c before
|
||||
// expect: b before
|
||||
// expect: a
|
||||
|
||||
// Nothing else gets run since the interpreter stops after a completes.
|
||||
Reference in New Issue
Block a user