[k2] add await set primitive#1418
Merged
Merged
Conversation
4520095 to
8c3a28b
Compare
apolyakov
requested changes
Oct 14, 2025
Contributor
|
Summary after discussion:
|
apolyakov
reviewed
Oct 20, 2025
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
General
This pull request adds an equivalent of JoinSet from rust-tokio to runtime-light. This primitive allows coroutines to be dynamically added to it and waits for their completion.
Example:
The primitive supports multiple awaiters. All awaiters are stored in a linked list.
In the constructor, you can also set the waiting policy. Two options are available -
suspend_on_emptyandresume_on_empty.They affect two aspects:
Details
The implementation of the primitive is similar to the implementations of
when_anyandwhen_all. The awaitables passed topushare wrapped in anawait_set_task, in thefinal_suspendof which the result is stored. Awaiters are linked to the list of results through theawait_brokerclass, which maintains a singly linked list of completed tasks and a doubly linked list of awaiters. As a remark, I would like to note that awaiters and ready tasks are stored in the lists as LIFO.Motivation
This is the first step towards implementing wait_queue builtins in the new runtime. Here's how a wait_queue can be approximately implemented using a primitive.