File tree Expand file tree Collapse file tree 2 files changed +10
-7
lines changed Expand file tree Collapse file tree 2 files changed +10
-7
lines changed Original file line number Diff line number Diff line change @@ -14,10 +14,10 @@ namespace signal {
14
14
"""
15
15
}
16
16
17
- extern global def unsafeSend[T](signal: Signal[T], value: T): Unit =
17
+ extern async def unsafeSend[T](signal: Signal[T], value: T): Unit =
18
18
llvm """
19
- call void @c_signal_send(%Pos ${signal}, %Pos ${value})
20
- ret %Pos zeroinitializer
19
+ call void @c_signal_send(%Pos ${signal}, %Pos ${value}, %Stack %stack )
20
+ ret void
21
21
"""
22
22
23
23
extern async def unsafeWait[T](signal: Signal[T]): T =
Original file line number Diff line number Diff line change @@ -338,13 +338,15 @@ struct Pos c_signal_make() {
338
338
return (struct Pos ) { .tag = 0 , .obj = signal , };
339
339
}
340
340
341
- void c_signal_send (struct Pos signal , struct Pos value ) {
341
+ void c_signal_send (struct Pos signal , struct Pos value , Stack stack ) {
342
342
Signal * f = (Signal * )signal .obj ;
343
343
switch (f -> state ) {
344
344
case BEFORE : {
345
345
f -> state = SENDING ;
346
346
f -> payload .value = value ;
347
347
erasePositive (signal );
348
+ // TODO avoid stack overflow without yielding
349
+ c_yield (stack );
348
350
break ;
349
351
}
350
352
case SENDING : {
@@ -354,11 +356,12 @@ void c_signal_send(struct Pos signal, struct Pos value) {
354
356
break ;
355
357
}
356
358
case WAITING : {
357
- Stack stack = f -> payload .stack ;
359
+ Stack other = f -> payload .stack ;
358
360
f -> state = AFTER ;
359
361
erasePositive (signal );
360
- // TODO this overflows the C stack
361
- resume_Pos (stack , value );
362
+ // TODO avoid stack overflow without yielding
363
+ c_yield (stack );
364
+ resume_Pos (other , value );
362
365
break ;
363
366
}
364
367
case AFTER : {
You can’t perform that action at this time.
0 commit comments