Skip to content

Commit 9ba847b

Browse files
committed
Delete promises
1 parent a4089d6 commit 9ba847b

File tree

1 file changed

+0
-149
lines changed

1 file changed

+0
-149
lines changed

libraries/llvm/io.c

Lines changed: 0 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -386,153 +386,4 @@ void c_future_wait(struct Pos future, Stack stack) {
386386
}
387387
}
388388

389-
// Promises
390-
// --------
391-
392-
typedef enum { UNRESOLVED, RESOLVED } promise_state_t;
393-
394-
typedef struct Listeners {
395-
Stack head;
396-
struct Listeners* tail;
397-
} Listeners;
398-
399-
typedef struct {
400-
uint64_t rc;
401-
void* eraser;
402-
promise_state_t state;
403-
// state of {
404-
// case UNRESOLVED => Possibly empty (head is NULL) list of listeners
405-
// case RESOLVED => Pos (the result)
406-
// }
407-
union {
408-
struct Pos value;
409-
Listeners listeners;
410-
} payload;
411-
} Promise;
412-
413-
void c_promise_erase_listeners(void *envPtr) {
414-
// envPtr points to a Promise _after_ the eraser, so let's adjust it to point to the promise.
415-
Promise *promise = (Promise*) (envPtr - offsetof(Promise, state));
416-
promise_state_t state = promise->state;
417-
418-
Stack head;
419-
Listeners* tail;
420-
Listeners* current;
421-
422-
switch (state) {
423-
case UNRESOLVED:
424-
head = promise->payload.listeners.head;
425-
tail = promise->payload.listeners.tail;
426-
if (head != NULL) {
427-
// Erase head
428-
eraseStack(head);
429-
// Erase tail
430-
current = tail;
431-
while (current != NULL) {
432-
head = current->head;
433-
tail = current->tail;
434-
free(current);
435-
eraseStack(head);
436-
current = tail;
437-
};
438-
};
439-
break;
440-
case RESOLVED:
441-
erasePositive(promise->payload.value);
442-
break;
443-
}
444-
}
445-
446-
void c_promise_resume_listeners(Listeners* listeners, struct Pos value) {
447-
if (listeners != NULL) {
448-
Stack head = listeners->head;
449-
Listeners* tail = listeners->tail;
450-
free(listeners);
451-
c_promise_resume_listeners(tail, value);
452-
sharePositive(value);
453-
resume_Pos(head, value);
454-
}
455-
}
456-
457-
void c_promise_resolve(struct Pos promise, struct Pos value, Stack stack) {
458-
Promise* p = (Promise*)promise.obj;
459-
460-
Stack head;
461-
Listeners* tail;
462-
463-
switch (p->state) {
464-
case UNRESOLVED:
465-
head = p->payload.listeners.head;
466-
tail = p->payload.listeners.tail;
467-
468-
p->state = RESOLVED;
469-
p->payload.value = value;
470-
resume_Pos(stack, Unit);
471-
472-
if (head != NULL) {
473-
// Execute tail
474-
c_promise_resume_listeners(tail, value);
475-
// Execute head
476-
sharePositive(value);
477-
resume_Pos(head, value);
478-
};
479-
break;
480-
case RESOLVED:
481-
erasePositive(promise);
482-
erasePositive(value);
483-
eraseStack(stack);
484-
fprintf(stderr, "ERROR: Promise already resolved\n");
485-
exit(1);
486-
break;
487-
}
488-
// TODO stack overflow?
489-
// We need to erase the promise now, since we consume it.
490-
erasePositive(promise);
491-
}
492-
493-
void c_promise_await(struct Pos promise, Stack stack) {
494-
Promise* p = (Promise*)promise.obj;
495-
496-
Stack head;
497-
Listeners* tail;
498-
Listeners* node;
499-
struct Pos value;
500-
501-
switch (p->state) {
502-
case UNRESOLVED:
503-
head = p->payload.listeners.head;
504-
tail = p->payload.listeners.tail;
505-
if (head != NULL) {
506-
node = (Listeners*)malloc(sizeof(Listeners));
507-
node->head = head;
508-
node->tail = tail;
509-
p->payload.listeners.head = stack;
510-
p->payload.listeners.tail = node;
511-
} else {
512-
p->payload.listeners.head = stack;
513-
};
514-
break;
515-
case RESOLVED:
516-
value = p->payload.value;
517-
sharePositive(value);
518-
resume_Pos(stack, value);
519-
break;
520-
};
521-
// TODO hmm, stack overflow?
522-
erasePositive(promise);
523-
}
524-
525-
struct Pos c_promise_make() {
526-
Promise* promise = (Promise*)malloc(sizeof(Promise));
527-
528-
promise->rc = 0;
529-
promise->eraser = c_promise_erase_listeners;
530-
promise->state = UNRESOLVED;
531-
promise->payload.listeners.head = NULL;
532-
promise->payload.listeners.tail = NULL;
533-
534-
return (struct Pos) { .tag = 0, .obj = promise, };
535-
}
536-
537-
538389
#endif

0 commit comments

Comments
 (0)