@@ -298,7 +298,7 @@ void c_yield(Stack stack) {
298
298
// Signals
299
299
// --------
300
300
301
- typedef enum { EMPTY , SENDED , WAITED } signal_state_t ;
301
+ typedef enum { BEFORE , SENDING , WAITING , AFTER } signal_state_t ;
302
302
303
303
typedef struct {
304
304
uint64_t rc ;
@@ -315,14 +315,16 @@ void c_signal_erase(void *envPtr) {
315
315
Signal * signal = (Signal * ) (envPtr - offsetof(Signal , state ));
316
316
signal_state_t state = signal -> state ;
317
317
switch (state ) {
318
- case EMPTY :
318
+ case BEFORE :
319
319
break ;
320
- case SENDED :
320
+ case SENDING :
321
321
erasePositive (signal -> payload .value );
322
322
break ;
323
- case WAITED :
323
+ case WAITING :
324
324
eraseStack (signal -> payload .stack );
325
325
break ;
326
+ case AFTER :
327
+ break ;
326
328
}
327
329
}
328
330
@@ -331,62 +333,70 @@ struct Pos c_signal_make() {
331
333
332
334
signal -> rc = 0 ;
333
335
signal -> eraser = c_signal_erase ;
334
- signal -> state = EMPTY ;
336
+ signal -> state = BEFORE ;
335
337
336
338
return (struct Pos ) { .tag = 0 , .obj = signal , };
337
339
}
338
340
339
341
void c_signal_send (struct Pos signal , struct Pos value ) {
340
342
Signal * f = (Signal * )signal .obj ;
341
343
switch (f -> state ) {
342
- case EMPTY : {
343
- f -> state = SENDED ;
344
+ case BEFORE : {
345
+ f -> state = SENDING ;
344
346
f -> payload .value = value ;
345
347
erasePositive (signal );
346
348
break ;
347
349
}
348
- case SENDED : {
349
- erasePositive (signal );
350
- erasePositive (value );
350
+ case SENDING : {
351
351
// TODO more graceful panic
352
352
fprintf (stderr , "ERROR: Signal already used for sending\n" );
353
353
exit (1 );
354
354
break ;
355
355
}
356
- case WAITED : {
356
+ case WAITING : {
357
357
Stack stack = f -> payload .stack ;
358
- f -> state = EMPTY ;
358
+ f -> state = AFTER ;
359
359
erasePositive (signal );
360
360
resume_Pos (stack , value );
361
361
break ;
362
362
}
363
+ case AFTER : {
364
+ // TODO more graceful panic
365
+ fprintf (stderr , "ERROR: Sending after signal happened\n" );
366
+ exit (1 );
367
+ break ;
368
+ }
363
369
}
364
370
}
365
371
366
372
void c_signal_wait (struct Pos signal , Stack stack ) {
367
373
Signal * f = (Signal * )signal .obj ;
368
374
switch (f -> state ) {
369
- case EMPTY : {
370
- f -> state = WAITED ;
375
+ case BEFORE : {
376
+ f -> state = WAITING ;
371
377
f -> payload .stack = stack ;
372
378
erasePositive (signal );
373
379
break ;
374
380
}
375
- case SENDED : {
381
+ case SENDING : {
376
382
struct Pos value = f -> payload .value ;
377
- f -> state = EMPTY ;
383
+ f -> state = AFTER ;
378
384
erasePositive (signal );
379
385
resume_Pos (stack , value );
380
386
break ;
381
387
}
382
- case WAITED : {
383
- erasePositive (signal );
384
- eraseStack (stack );
388
+ case WAITING : {
385
389
// TODO more graceful panic
386
390
fprintf (stderr , "ERROR: Signal already used for waiting\n" );
387
391
exit (1 );
388
392
break ;
389
393
}
394
+ case AFTER : {
395
+ // TODO more graceful panic
396
+ fprintf (stderr , "ERROR: Waiting after signal happened\n" );
397
+ exit (1 );
398
+ break ;
399
+ }
390
400
}
391
401
}
392
402
0 commit comments