@@ -386,153 +386,4 @@ void c_future_wait(struct Pos future, Stack stack) {
386
386
}
387
387
}
388
388
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
-
538
389
#endif
0 commit comments