Skip to content

Commit 2ab779b

Browse files
committed
CABI: move the call state out of the event-code enum and into the payload
Resolves #492
1 parent c261e8b commit 2ab779b

File tree

3 files changed

+50
-44
lines changed

3 files changed

+50
-44
lines changed

design/mvp/CanonicalABI.md

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

831824
EventTuple = tuple[EventCode, int, int]
832825
```
@@ -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
@@ -2993,7 +2991,7 @@ immediately return control flow back to the `async` caller if `callee` blocks:
29932991
def subtask_event():
29942992
if subtask.state == CallState.RETURNED:
29952993
subtask.finish()
2996-
return (EventCode(subtask.state), subtaski, 0)
2994+
return (EventCode.SUBTASK, subtaski, subtask.state)
29972995
subtask.set_event(subtask_event)
29982996
assert(0 < subtaski <= Table.MAX_LENGTH < 2**28)
29992997
assert(0 <= int(subtask.state) < 2**4)

design/mvp/canonical-abi/definitions.py

Lines changed: 11 additions & 13 deletions
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

@@ -600,6 +593,11 @@ def drop(self):
600593

601594
#### Subtask State
602595

596+
class CallState(IntEnum):
597+
STARTING = 0
598+
STARTED = 1
599+
RETURNED = 2
600+
603601
class Subtask(Waitable):
604602
state: CallState
605603
lenders: list[ResourceHandle]
@@ -1841,7 +1839,7 @@ def on_progress():
18411839
def subtask_event():
18421840
if subtask.state == CallState.RETURNED:
18431841
subtask.finish()
1844-
return (EventCode(subtask.state), subtaski, 0)
1842+
return (EventCode.SUBTASK, subtaski, subtask.state)
18451843
subtask.set_event(subtask_event)
18461844
assert(0 < subtaski <= Table.MAX_LENGTH < 2**28)
18471845
assert(0 <= int(subtask.state) < 2**4)

design/mvp/canonical-abi/run_tests.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -583,19 +583,22 @@ async def consumer(task, args):
583583

584584
waitretp = consumer_heap.realloc(0, 0, 8, 4)
585585
[event] = await canon_waitable_set_wait(False, consumer_heap.memory, task, seti, waitretp)
586-
assert(event == EventCode.CALL_RETURNED)
586+
assert(event == EventCode.SUBTASK)
587587
assert(consumer_heap.memory[waitretp] == subi1)
588+
assert(consumer_heap.memory[waitretp+4] == CallState.RETURNED)
588589
[] = await canon_subtask_drop(task, subi1)
589590

590591
[event] = await canon_waitable_set_wait(True, consumer_heap.memory, task, seti, waitretp)
591-
assert(event == EventCode.CALL_STARTED)
592+
assert(event == EventCode.SUBTASK)
592593
assert(consumer_heap.memory[waitretp] == subi2)
594+
assert(consumer_heap.memory[waitretp+4] == CallState.STARTED)
593595
assert(consumer_heap.memory[retp] == 13)
594596
fut2.set_result(None)
595597

596598
[event] = await canon_waitable_set_wait(False, consumer_heap.memory, task, seti, waitretp)
597-
assert(event == EventCode.CALL_RETURNED)
599+
assert(event == EventCode.SUBTASK)
598600
assert(consumer_heap.memory[waitretp] == subi2)
601+
assert(consumer_heap.memory[waitretp+4] == CallState.RETURNED)
599602
assert(consumer_heap.memory[retp] == 44)
600603
[] = await canon_subtask_drop(task, subi2)
601604
fut3.set_result(None)
@@ -623,8 +626,9 @@ async def dtor(task, args):
623626

624627
[] = await canon_waitable_join(task, dtorsubi, seti)
625628
[event] = await canon_waitable_set_wait(False, consumer_heap.memory, task, seti, waitretp)
626-
assert(event == CallState.RETURNED)
629+
assert(event == EventCode.SUBTASK)
627630
assert(consumer_heap.memory[waitretp] == dtorsubi)
631+
assert(consumer_heap.memory[waitretp+4] == CallState.RETURNED)
628632
assert(dtor_value == 50)
629633
[] = await canon_subtask_drop(task, dtorsubi)
630634
[] = await canon_waitable_set_drop(task, seti)
@@ -695,9 +699,9 @@ async def callback(task, args):
695699
[ctx] = await canon_context_get('i32', 0, task)
696700
match ctx:
697701
case 42:
698-
assert(args[0] == EventCode.CALL_RETURNED)
702+
assert(args[0] == EventCode.SUBTASK)
699703
assert(args[1] == 1)
700-
assert(args[2] == 0)
704+
assert(args[2] == CallState.RETURNED)
701705
await canon_subtask_drop(task, 1)
702706
[] = await canon_context_set('i32', 0, task, 52)
703707
return [definitions.CallbackCode.YIELD]
@@ -709,9 +713,9 @@ async def callback(task, args):
709713
[] = await canon_context_set('i32', 0, task, 62)
710714
return [definitions.CallbackCode.WAIT]
711715
case 62:
712-
assert(args[0] == EventCode.CALL_RETURNED)
716+
assert(args[0] == EventCode.SUBTASK)
713717
assert(args[1] == 2)
714-
assert(args[2] == 0)
718+
assert(args[2] == CallState.RETURNED)
715719
await canon_subtask_drop(task, 2)
716720
[] = await canon_task_return(task, [U32Type()], opts, [83])
717721
return [definitions.CallbackCode.EXIT]
@@ -786,8 +790,9 @@ async def consumer(task, args):
786790

787791
retp = consumer_heap.realloc(0,0,8,4)
788792
[event] = await canon_waitable_set_wait(False, consumer_heap.memory, task, seti, retp)
789-
assert(event == EventCode.CALL_RETURNED)
793+
assert(event == EventCode.SUBTASK)
790794
assert(consumer_heap.memory[retp] == subi1)
795+
assert(consumer_heap.memory[retp+4] == CallState.RETURNED)
791796
await canon_subtask_drop(task, subi1)
792797
assert(producer1_done == True)
793798

@@ -796,8 +801,9 @@ async def consumer(task, args):
796801
assert(producer2_done == True)
797802

798803
[event] = await canon_waitable_set_poll(False, consumer_heap.memory, task, seti, retp)
799-
assert(event == EventCode.CALL_RETURNED)
804+
assert(event == EventCode.SUBTASK)
800805
assert(consumer_heap.memory[retp] == subi2)
806+
assert(consumer_heap.memory[retp+4] == CallState.RETURNED)
801807
await canon_subtask_drop(task, subi2)
802808
assert(producer2_done == True)
803809

@@ -873,13 +879,15 @@ async def consumer(task, args):
873879

874880
retp = consumer_heap.realloc(0,0,8,4)
875881
[event] = await canon_waitable_set_wait(False, consumer_heap.memory, task, seti, retp)
876-
assert(event == EventCode.CALL_RETURNED)
882+
assert(event == EventCode.SUBTASK)
877883
assert(consumer_heap.memory[retp] == subi1)
884+
assert(consumer_heap.memory[retp+4] == CallState.RETURNED)
878885
assert(producer1_done == True)
879886

880887
[event] = await canon_waitable_set_poll(False, consumer_heap.memory, task, seti, retp)
881-
assert(event == EventCode.CALL_RETURNED)
888+
assert(event == EventCode.SUBTASK)
882889
assert(consumer_heap.memory[retp] == subi2)
890+
assert(consumer_heap.memory[retp+4] == CallState.RETURNED)
883891
assert(producer2_done == True)
884892

885893
await canon_subtask_drop(task, subi1)
@@ -941,14 +949,16 @@ async def core_func(task, args):
941949

942950
retp = lower_heap.realloc(0,0,8,4)
943951
[event] = await canon_waitable_set_wait(False, lower_heap.memory, task, seti, retp)
944-
assert(event == EventCode.CALL_RETURNED)
952+
assert(event == EventCode.SUBTASK)
945953
assert(lower_heap.memory[retp] == subi1)
954+
assert(lower_heap.memory[retp+4] == CallState.RETURNED)
946955

947956
fut2.set_result(None)
948957

949958
[event] = await canon_waitable_set_wait(False, lower_heap.memory, task, seti, retp)
950-
assert(event == EventCode.CALL_RETURNED)
959+
assert(event == EventCode.SUBTASK)
951960
assert(lower_heap.memory[retp] == subi2)
961+
assert(lower_heap.memory[retp+4] == CallState.RETURNED)
952962

953963
await canon_subtask_drop(task, subi1)
954964
await canon_subtask_drop(task, subi2)

0 commit comments

Comments
 (0)