Skip to content

Commit 02b6d11

Browse files
committed
Fix future reference count
1 parent 9ba847b commit 02b6d11

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

libraries/common/io/promise.effekt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import io
55
// Futures
66
// -------
77

8+
/// Must be filled exactly once and waited exactly once
89
extern type Future[T]
910

1011
namespace future {

libraries/llvm/io.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@ void c_future_fill(struct Pos future, struct Pos value) {
342342
case EMPTY: {
343343
f->state = FILLED;
344344
f->payload.value = value;
345+
erasePositive(future);
345346
break;
346347
}
347348
case FILLED: {
@@ -354,7 +355,8 @@ void c_future_fill(struct Pos future, struct Pos value) {
354355
}
355356
case WAITED: {
356357
Stack stack = f->payload.stack;
357-
free(f);
358+
f->state = EMPTY;
359+
erasePositive(future);
358360
resume_Pos(stack, value);
359361
break;
360362
}
@@ -367,11 +369,13 @@ void c_future_wait(struct Pos future, Stack stack) {
367369
case EMPTY: {
368370
f->state = WAITED;
369371
f->payload.stack = stack;
372+
erasePositive(future);
370373
break;
371374
}
372375
case FILLED: {
373376
struct Pos value = f->payload.value;
374-
free(f);
377+
f->state = EMPTY;
378+
erasePositive(future);
375379
resume_Pos(stack, value);
376380
break;
377381
}

0 commit comments

Comments
 (0)