@@ -298,7 +298,7 @@ void c_yield(Stack stack) {
298
298
// Signals
299
299
// --------
300
300
301
- typedef enum { BEFORE , NOTIFIED , AFTER } signal_state_t ;
301
+ typedef enum { INITIAL , NOTIFIED } signal_state_t ;
302
302
303
303
typedef struct {
304
304
uint64_t rc ;
@@ -311,34 +311,26 @@ typedef struct {
311
311
void c_signal_erase (void * envPtr ) {
312
312
// envPtr points to a Signal _after_ the eraser, so let's adjust it to point to the beginning.
313
313
Signal * signal = (Signal * ) (envPtr - offsetof(Signal , state ));
314
- // TODO exploit value and stack being NULL
315
- signal_state_t state = signal -> state ;
316
- switch (state ) {
317
- case BEFORE :
318
- break ;
319
- case NOTIFIED :
320
- erasePositive (signal -> value );
321
- eraseStack (signal -> stack );
322
- break ;
323
- case AFTER :
324
- break ;
325
- }
314
+ erasePositive (signal -> value );
315
+ if (signal -> stack != NULL ) { eraseStack (signal -> stack ); }
326
316
}
327
317
328
318
struct Pos c_signal_make () {
329
- Signal * signal = (Signal * )malloc (sizeof (Signal ));
319
+ Signal * f = (Signal * )malloc (sizeof (Signal ));
330
320
331
- signal -> rc = 0 ;
332
- signal -> eraser = c_signal_erase ;
333
- signal -> state = BEFORE ;
321
+ f -> rc = 0 ;
322
+ f -> eraser = c_signal_erase ;
323
+ f -> state = INITIAL ;
324
+ f -> value = (struct Pos ) { .tag = 0 , .obj = NULL , };
325
+ f -> stack = NULL ;
334
326
335
- return (struct Pos ) { .tag = 0 , .obj = signal , };
327
+ return (struct Pos ) { .tag = 0 , .obj = f , };
336
328
}
337
329
338
330
void c_signal_notify (struct Pos signal , struct Pos value , Stack stack ) {
339
331
Signal * f = (Signal * )signal .obj ;
340
332
switch (f -> state ) {
341
- case BEFORE : {
333
+ case INITIAL : {
342
334
f -> state = NOTIFIED ;
343
335
f -> value = value ;
344
336
f -> stack = stack ;
@@ -347,19 +339,14 @@ void c_signal_notify(struct Pos signal, struct Pos value, Stack stack) {
347
339
}
348
340
case NOTIFIED : {
349
341
struct Pos other_value = f -> value ;
342
+ f -> value = (struct Pos ) { .tag = 0 , .obj = NULL , };
350
343
Stack other_stack = f -> stack ;
351
- f -> state = AFTER ;
344
+ f -> stack = NULL ;
352
345
erasePositive (signal );
353
346
resume_Pos (other_stack , value );
354
347
resume_Pos (stack , other_value );
355
348
break ;
356
349
}
357
- case AFTER : {
358
- // TODO more graceful panic
359
- fprintf (stderr , "ERROR: Sending after signal happened\n" );
360
- exit (1 );
361
- break ;
362
- }
363
350
}
364
351
}
365
352
0 commit comments