Skip to content

Commit ce117fb

Browse files
committed
State after signal happened
1 parent 5aa2196 commit ce117fb

File tree

1 file changed

+29
-19
lines changed

1 file changed

+29
-19
lines changed

libraries/llvm/io.c

Lines changed: 29 additions & 19 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 { EMPTY, SENDED, WAITED } signal_state_t;
301+
typedef enum { BEFORE, SENDING, WAITING, AFTER } signal_state_t;
302302

303303
typedef struct {
304304
uint64_t rc;
@@ -315,14 +315,16 @@ void c_signal_erase(void *envPtr) {
315315
Signal *signal = (Signal*) (envPtr - offsetof(Signal, state));
316316
signal_state_t state = signal->state;
317317
switch (state) {
318-
case EMPTY:
318+
case BEFORE:
319319
break;
320-
case SENDED:
320+
case SENDING:
321321
erasePositive(signal->payload.value);
322322
break;
323-
case WAITED:
323+
case WAITING:
324324
eraseStack(signal->payload.stack);
325325
break;
326+
case AFTER:
327+
break;
326328
}
327329
}
328330

@@ -331,62 +333,70 @@ struct Pos c_signal_make() {
331333

332334
signal->rc = 0;
333335
signal->eraser = c_signal_erase;
334-
signal->state = EMPTY;
336+
signal->state = BEFORE;
335337

336338
return (struct Pos) { .tag = 0, .obj = signal, };
337339
}
338340

339341
void c_signal_send(struct Pos signal, struct Pos value) {
340342
Signal* f = (Signal*)signal.obj;
341343
switch (f->state) {
342-
case EMPTY: {
343-
f->state = SENDED;
344+
case BEFORE: {
345+
f->state = SENDING;
344346
f->payload.value = value;
345347
erasePositive(signal);
346348
break;
347349
}
348-
case SENDED: {
349-
erasePositive(signal);
350-
erasePositive(value);
350+
case SENDING: {
351351
// TODO more graceful panic
352352
fprintf(stderr, "ERROR: Signal already used for sending\n");
353353
exit(1);
354354
break;
355355
}
356-
case WAITED: {
356+
case WAITING: {
357357
Stack stack = f->payload.stack;
358-
f->state = EMPTY;
358+
f->state = AFTER;
359359
erasePositive(signal);
360360
resume_Pos(stack, value);
361361
break;
362362
}
363+
case AFTER: {
364+
// TODO more graceful panic
365+
fprintf(stderr, "ERROR: Sending after signal happened\n");
366+
exit(1);
367+
break;
368+
}
363369
}
364370
}
365371

366372
void c_signal_wait(struct Pos signal, Stack stack) {
367373
Signal* f = (Signal*)signal.obj;
368374
switch (f->state) {
369-
case EMPTY: {
370-
f->state = WAITED;
375+
case BEFORE: {
376+
f->state = WAITING;
371377
f->payload.stack = stack;
372378
erasePositive(signal);
373379
break;
374380
}
375-
case SENDED: {
381+
case SENDING: {
376382
struct Pos value = f->payload.value;
377-
f->state = EMPTY;
383+
f->state = AFTER;
378384
erasePositive(signal);
379385
resume_Pos(stack, value);
380386
break;
381387
}
382-
case WAITED: {
383-
erasePositive(signal);
384-
eraseStack(stack);
388+
case WAITING: {
385389
// TODO more graceful panic
386390
fprintf(stderr, "ERROR: Signal already used for waiting\n");
387391
exit(1);
388392
break;
389393
}
394+
case AFTER: {
395+
// TODO more graceful panic
396+
fprintf(stderr, "ERROR: Waiting after signal happened\n");
397+
exit(1);
398+
break;
399+
}
390400
}
391401
}
392402

0 commit comments

Comments
 (0)