@@ -50,7 +50,7 @@ object VThreadScheduler extends Scheduler:
5050object VThreadSupport extends AsyncSupport :
5151 type Scheduler = VThreadScheduler .type
5252
53- private final class VThreadLabel [R ]():
53+ private final class VThreadLabel [R ]() extends caps. Capability :
5454 private var result : Option [R ] = None
5555 private val lock = ReentrantLock ()
5656 private val cond = lock.newCondition()
@@ -74,11 +74,11 @@ object VThreadSupport extends AsyncSupport:
7474 result.get
7575 finally lock.unlock()
7676
77- override opaque type Label [R ] = VThreadLabel [R ]
77+ override opaque type Label [R , Cap ^ ] <: caps. Capability = VThreadLabel [R ]
7878
7979 // outside boundary: waiting on label
8080 // inside boundary: waiting on suspension
81- private final class VThreadSuspension [- T , + R ](using private [VThreadSupport ] val l : Label [R ] @ uncheckedVariance)
81+ private final class VThreadSuspension [- T , + R ](using private [VThreadSupport ] val l : VThreadLabel [R ] @ uncheckedVariance)
8282 extends gears.async.Suspension [T , R ]:
8383 private var nextInput : Option [T ] = None
8484 private val lock = ReentrantLock ()
@@ -107,25 +107,28 @@ object VThreadSupport extends AsyncSupport:
107107
108108 override opaque type Suspension [- T , + R ] <: gears.async.Suspension [T , R ] = VThreadSuspension [T , R ]
109109
110- override def boundary [R ](body : ( Label [R ]) ?=> R ): R =
110+ override def boundary [R , Cap ^ ](body : Label [R , Cap ] ^ ?-> { Cap ^ } R ): R =
111111 val label = VThreadLabel [R ]()
112112 VThreadScheduler .execute: () =>
113113 val result = body(using label)
114114 label.setResult(result)
115115
116116 label.waitResult()
117117
118- override private [async] def resumeAsync [T , R ](suspension : Suspension [T , R ])(arg : T )(using Scheduler ): Unit =
118+ override private [async] def resumeAsync [T , R ](suspension : Suspension [T , R ]^ )(arg : T )(using Scheduler ): Unit =
119119 suspension.l.clearResult()
120120 suspension.setInput(arg)
121121
122- override def scheduleBoundary (body : ( Label [Unit ]) ?=> Unit )(using Scheduler ): Unit =
122+ override def scheduleBoundary [ Cap ^ ] (body : Label [Unit , Cap ] ?-> { Cap ^ } Unit )(using Scheduler ): Unit =
123123 VThreadScheduler .execute: () =>
124124 val label = VThreadLabel [Unit ]()
125125 body(using label)
126126
127- override def suspend [T , R ](body : Suspension [T , R ] => R )(using l : Label [R ] ): T =
128- val sus = new VThreadSuspension [T , R ]()
127+ override def suspend [T , R , Cap ^ ](body : Suspension [T , R ]^ { Cap ^ } => R ^ { Cap ^ } )(using l : Label [R , Cap ] ^ ): T =
128+ val sus = new VThreadSuspension [T , R ](using caps.unsafe.unsafeAssumePure(l) )
129129 val res = body(sus)
130- l.setResult(res)
130+ l.setResult(
131+ // SAFETY: will only be stored and returned by the Suspension resumption mechanism
132+ caps.unsafe.unsafeAssumePure(res)
133+ )
131134 sus.waitInput()
0 commit comments