Skip to content

Commit f19d247

Browse files
committed
Further simplify signal code
1 parent bd0ab32 commit f19d247

File tree

1 file changed

+13
-26
lines changed

1 file changed

+13
-26
lines changed

libraries/llvm/io.c

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ void c_yield(Stack stack) {
298298
// Signals
299299
// --------
300300

301-
typedef enum { BEFORE, NOTIFIED, AFTER } signal_state_t;
301+
typedef enum { INITIAL, NOTIFIED } signal_state_t;
302302

303303
typedef struct {
304304
uint64_t rc;
@@ -311,34 +311,26 @@ typedef struct {
311311
void c_signal_erase(void *envPtr) {
312312
// envPtr points to a Signal _after_ the eraser, so let's adjust it to point to the beginning.
313313
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); }
326316
}
327317

328318
struct Pos c_signal_make() {
329-
Signal* signal = (Signal*)malloc(sizeof(Signal));
319+
Signal* f = (Signal*)malloc(sizeof(Signal));
330320

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;
334326

335-
return (struct Pos) { .tag = 0, .obj = signal, };
327+
return (struct Pos) { .tag = 0, .obj = f, };
336328
}
337329

338330
void c_signal_notify(struct Pos signal, struct Pos value, Stack stack) {
339331
Signal* f = (Signal*)signal.obj;
340332
switch (f->state) {
341-
case BEFORE: {
333+
case INITIAL: {
342334
f->state = NOTIFIED;
343335
f->value = value;
344336
f->stack = stack;
@@ -347,19 +339,14 @@ void c_signal_notify(struct Pos signal, struct Pos value, Stack stack) {
347339
}
348340
case NOTIFIED: {
349341
struct Pos other_value = f->value;
342+
f->value = (struct Pos) { .tag = 0, .obj = NULL, };
350343
Stack other_stack = f->stack;
351-
f->state = AFTER;
344+
f->stack = NULL;
352345
erasePositive(signal);
353346
resume_Pos(other_stack, value);
354347
resume_Pos(stack, other_value);
355348
break;
356349
}
357-
case AFTER: {
358-
// TODO more graceful panic
359-
fprintf(stderr, "ERROR: Sending after signal happened\n");
360-
exit(1);
361-
break;
362-
}
363350
}
364351
}
365352

0 commit comments

Comments
 (0)