Fix a bug caused by drop order of the Core
struct
#263
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.
This is a very subtle problem with the order of the fields of the
Core
type interacting with the async runtime when using channels (and possibly other coordination primitives).The problem is this:
.await
.task_sender
channel to close.A::Capabilities
instance is dropped, dropping the capability instance, including the sending end of the channelDrop
implementation closes the channel, which wakes up the future, so that therecv()
method can returnErr
ArcWake
implementation on the task spawned by Crux'sSpawner
attempts to.send
self to thetask_sender
, which fails, because the receving end dropped in step 4, and we panic on the.expect
To fix, I've reordered the fields of Core to drop the user defined types first, so that any Crux infrastructure they rely on is still alive when any
Drop
implementations in them run.