Skip to content

Commit 4745bd9

Browse files
authored
CABI: move the call state out of the event-code enum and into the payload (#500)
Resolves #492
1 parent 4fb85b4 commit 4745bd9

File tree

4 files changed

+51
-47
lines changed

4 files changed

+51
-47
lines changed

design/mvp/CanonicalABI.md

+15-17
Original file line numberDiff line numberDiff line change
@@ -812,20 +812,13 @@ to be interpreted based on the `EventCode`. The meaning of the different
812812
code that produces the events (specifically, in `subtask_event` and
813813
`copy_event`).
814814
```python
815-
class CallState(IntEnum):
816-
STARTING = 1
817-
STARTED = 2
818-
RETURNED = 3
819-
820815
class EventCode(IntEnum):
821816
NONE = 0
822-
CALL_STARTING = CallState.STARTING
823-
CALL_STARTED = CallState.STARTED
824-
CALL_RETURNED = CallState.RETURNED
825-
STREAM_READ = 5
826-
STREAM_WRITE = 6
827-
FUTURE_READ = 7
828-
FUTURE_WRITE = 8
817+
SUBTASK = 1
818+
STREAM_READ = 2
819+
STREAM_WRITE = 3
820+
FUTURE_READ = 4
821+
FUTURE_WRITE = 5
829822

830823
EventTuple = tuple[EventCode, int, int]
831824
```
@@ -966,6 +959,11 @@ only manages a few fields of state that are relevant to the caller. As with
966959
`Task`, this section will introduce `Subtask` incrementally, starting with its
967960
fields and initialization:
968961
```python
962+
class CallState(IntEnum):
963+
STARTING = 0
964+
STARTED = 1
965+
RETURNED = 2
966+
969967
class Subtask(Waitable):
970968
state: CallState
971969
lenders: list[ResourceHandle]
@@ -978,10 +976,10 @@ class Subtask(Waitable):
978976
self.finished = False
979977
self.supertask = None
980978
```
981-
The `state` field of `Subtask` holds a `CallState` enum value (defined above as
982-
part of the definition of `EventCode`) that describes the callee's current
983-
state along the linear progression from [`STARTING`](Async.md#backpressure) to
984-
`STARTED` to [`RETURNED`](Async.md#returning).
979+
The `state` field of `Subtask` holds a `CallState` enum value that describes
980+
the callee's current state along the linear progression from
981+
[`STARTING`](Async.md#backpressure) to `STARTED` to
982+
[`RETURNED`](Async.md#returning).
985983

986984
Although `Subtask` derives `Waitable`, `__init__` does not initialize the
987985
`Waitable` base object. Instead, the `Waitable` base is only initialized when
@@ -2954,7 +2952,7 @@ immediately return control flow back to the `async` caller if `callee` blocks:
29542952
def subtask_event():
29552953
if subtask.state == CallState.RETURNED:
29562954
subtask.finish()
2957-
return (EventCode(subtask.state), subtaski, 0)
2955+
return (EventCode.SUBTASK, subtaski, subtask.state)
29582956
subtask.set_event(subtask_event)
29592957
assert(0 < subtaski <= Table.MAX_LENGTH < 2**28)
29602958
assert(0 <= int(subtask.state) < 2**4)

design/mvp/Explainer.md

+1-3
Original file line numberDiff line numberDiff line change
@@ -1641,9 +1641,7 @@ record event {
16411641
}
16421642
enum event-code {
16431643
none,
1644-
call-starting,
1645-
call-started,
1646-
call-returned,
1644+
subtask,
16471645
stream-read,
16481646
stream-write,
16491647
future-read,

design/mvp/canonical-abi/definitions.py

+11-13
Original file line numberDiff line numberDiff line change
@@ -506,20 +506,13 @@ def exit(self):
506506

507507
#### Waitable State
508508

509-
class CallState(IntEnum):
510-
STARTING = 1
511-
STARTED = 2
512-
RETURNED = 3
513-
514509
class EventCode(IntEnum):
515510
NONE = 0
516-
CALL_STARTING = CallState.STARTING
517-
CALL_STARTED = CallState.STARTED
518-
CALL_RETURNED = CallState.RETURNED
519-
STREAM_READ = 5
520-
STREAM_WRITE = 6
521-
FUTURE_READ = 7
522-
FUTURE_WRITE = 8
511+
SUBTASK = 1
512+
STREAM_READ = 2
513+
STREAM_WRITE = 3
514+
FUTURE_READ = 4
515+
FUTURE_WRITE = 5
523516

524517
EventTuple = tuple[EventCode, int, int]
525518

@@ -601,6 +594,11 @@ def drop(self):
601594

602595
#### Subtask State
603596

597+
class CallState(IntEnum):
598+
STARTING = 0
599+
STARTED = 1
600+
RETURNED = 2
601+
604602
class Subtask(Waitable):
605603
state: CallState
606604
lenders: list[ResourceHandle]
@@ -1826,7 +1824,7 @@ def on_progress():
18261824
def subtask_event():
18271825
if subtask.state == CallState.RETURNED:
18281826
subtask.finish()
1829-
return (EventCode(subtask.state), subtaski, 0)
1827+
return (EventCode.SUBTASK, subtaski, subtask.state)
18301828
subtask.set_event(subtask_event)
18311829
assert(0 < subtaski <= Table.MAX_LENGTH < 2**28)
18321830
assert(0 <= int(subtask.state) < 2**4)

design/mvp/canonical-abi/run_tests.py

+24-14
Original file line numberDiff line numberDiff line change
@@ -586,19 +586,22 @@ async def consumer(task, args):
586586

587587
waitretp = consumer_heap.realloc(0, 0, 8, 4)
588588
[event] = await canon_waitable_set_wait(False, consumer_heap.memory, task, seti, waitretp)
589-
assert(event == EventCode.CALL_RETURNED)
589+
assert(event == EventCode.SUBTASK)
590590
assert(consumer_heap.memory[waitretp] == subi1)
591+
assert(consumer_heap.memory[waitretp+4] == CallState.RETURNED)
591592
[] = await canon_subtask_drop(task, subi1)
592593

593594
[event] = await canon_waitable_set_wait(True, consumer_heap.memory, task, seti, waitretp)
594-
assert(event == EventCode.CALL_STARTED)
595+
assert(event == EventCode.SUBTASK)
595596
assert(consumer_heap.memory[waitretp] == subi2)
597+
assert(consumer_heap.memory[waitretp+4] == CallState.STARTED)
596598
assert(consumer_heap.memory[retp] == 13)
597599
fut2.set_result(None)
598600

599601
[event] = await canon_waitable_set_wait(False, consumer_heap.memory, task, seti, waitretp)
600-
assert(event == EventCode.CALL_RETURNED)
602+
assert(event == EventCode.SUBTASK)
601603
assert(consumer_heap.memory[waitretp] == subi2)
604+
assert(consumer_heap.memory[waitretp+4] == CallState.RETURNED)
602605
assert(consumer_heap.memory[retp] == 44)
603606
[] = await canon_subtask_drop(task, subi2)
604607
fut3.set_result(None)
@@ -626,8 +629,9 @@ async def dtor(task, args):
626629

627630
[] = await canon_waitable_join(task, dtorsubi, seti)
628631
[event] = await canon_waitable_set_wait(False, consumer_heap.memory, task, seti, waitretp)
629-
assert(event == CallState.RETURNED)
632+
assert(event == EventCode.SUBTASK)
630633
assert(consumer_heap.memory[waitretp] == dtorsubi)
634+
assert(consumer_heap.memory[waitretp+4] == CallState.RETURNED)
631635
assert(dtor_value == 50)
632636
[] = await canon_subtask_drop(task, dtorsubi)
633637
[] = await canon_waitable_set_drop(task, seti)
@@ -698,9 +702,9 @@ async def callback(task, args):
698702
[ctx] = await canon_context_get('i32', 0, task)
699703
match ctx:
700704
case 42:
701-
assert(args[0] == EventCode.CALL_RETURNED)
705+
assert(args[0] == EventCode.SUBTASK)
702706
assert(args[1] == 1)
703-
assert(args[2] == 0)
707+
assert(args[2] == CallState.RETURNED)
704708
await canon_subtask_drop(task, 1)
705709
[] = await canon_context_set('i32', 0, task, 52)
706710
return [definitions.CallbackCode.YIELD]
@@ -712,9 +716,9 @@ async def callback(task, args):
712716
[] = await canon_context_set('i32', 0, task, 62)
713717
return [definitions.CallbackCode.WAIT]
714718
case 62:
715-
assert(args[0] == EventCode.CALL_RETURNED)
719+
assert(args[0] == EventCode.SUBTASK)
716720
assert(args[1] == 2)
717-
assert(args[2] == 0)
721+
assert(args[2] == CallState.RETURNED)
718722
await canon_subtask_drop(task, 2)
719723
[] = await canon_task_return(task, [U32Type()], opts, [83])
720724
return [definitions.CallbackCode.EXIT]
@@ -789,8 +793,9 @@ async def consumer(task, args):
789793

790794
retp = consumer_heap.realloc(0,0,8,4)
791795
[event] = await canon_waitable_set_wait(False, consumer_heap.memory, task, seti, retp)
792-
assert(event == EventCode.CALL_RETURNED)
796+
assert(event == EventCode.SUBTASK)
793797
assert(consumer_heap.memory[retp] == subi1)
798+
assert(consumer_heap.memory[retp+4] == CallState.RETURNED)
794799
await canon_subtask_drop(task, subi1)
795800
assert(producer1_done == True)
796801

@@ -799,8 +804,9 @@ async def consumer(task, args):
799804
assert(producer2_done == True)
800805

801806
[event] = await canon_waitable_set_poll(False, consumer_heap.memory, task, seti, retp)
802-
assert(event == EventCode.CALL_RETURNED)
807+
assert(event == EventCode.SUBTASK)
803808
assert(consumer_heap.memory[retp] == subi2)
809+
assert(consumer_heap.memory[retp+4] == CallState.RETURNED)
804810
await canon_subtask_drop(task, subi2)
805811
assert(producer2_done == True)
806812

@@ -876,13 +882,15 @@ async def consumer(task, args):
876882

877883
retp = consumer_heap.realloc(0,0,8,4)
878884
[event] = await canon_waitable_set_wait(False, consumer_heap.memory, task, seti, retp)
879-
assert(event == EventCode.CALL_RETURNED)
885+
assert(event == EventCode.SUBTASK)
880886
assert(consumer_heap.memory[retp] == subi1)
887+
assert(consumer_heap.memory[retp+4] == CallState.RETURNED)
881888
assert(producer1_done == True)
882889

883890
[event] = await canon_waitable_set_poll(False, consumer_heap.memory, task, seti, retp)
884-
assert(event == EventCode.CALL_RETURNED)
891+
assert(event == EventCode.SUBTASK)
885892
assert(consumer_heap.memory[retp] == subi2)
893+
assert(consumer_heap.memory[retp+4] == CallState.RETURNED)
886894
assert(producer2_done == True)
887895

888896
await canon_subtask_drop(task, subi1)
@@ -944,14 +952,16 @@ async def core_func(task, args):
944952

945953
retp = lower_heap.realloc(0,0,8,4)
946954
[event] = await canon_waitable_set_wait(False, lower_heap.memory, task, seti, retp)
947-
assert(event == EventCode.CALL_RETURNED)
955+
assert(event == EventCode.SUBTASK)
948956
assert(lower_heap.memory[retp] == subi1)
957+
assert(lower_heap.memory[retp+4] == CallState.RETURNED)
949958

950959
fut2.set_result(None)
951960

952961
[event] = await canon_waitable_set_wait(False, lower_heap.memory, task, seti, retp)
953-
assert(event == EventCode.CALL_RETURNED)
962+
assert(event == EventCode.SUBTASK)
954963
assert(lower_heap.memory[retp] == subi2)
964+
assert(lower_heap.memory[retp+4] == CallState.RETURNED)
955965

956966
await canon_subtask_drop(task, subi1)
957967
await canon_subtask_drop(task, subi2)

0 commit comments

Comments
 (0)