-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
rt: do not trace tasks while locking OwnedTasks
#6036
Merged
+114
−32
Merged
Changes from 2 commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
a8577e8
rt: do not trace tasks while locking `OwnedTasks`
jswrenn 6331ddb
Merge branch 'master' into taskdump-deadlock-fix
jswrenn db49d55
remove needless re-scheduling and add regression tests
jswrenn 2849fb3
rt: don't persist raw tasks
jswrenn fe4b3a8
encapsulate ref-count management for tracing
jswrenn 1a904c8
don't increment refcount in `transition_to_notified_for_tracing`
jswrenn 4264f61
don't clone in `notify_for_tracing`
jswrenn f770673
don't clone in `trace_owned`
jswrenn 05a3422
remove dead `Clone` impl for `Task`
jswrenn File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains 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
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should be taking a refcount to the task instead of using
as_raw
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the API for that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can add this:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Huh. I realized that
transition_to_notified_for_tracing
actually performs a refcount increment. Because of that, you don't need the additional refcount increment. However, I would probably prefer to see this refcount management a bit more wrapped up in a less error-prone api.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hm. Unfortunately, now I'm quite confused by how refcount management is supposed to work. I removed only the increment in
transition_to_notified_for_tracing
, but doing so causes the tests to SIGABRT:What's the relationship between notifying a task, polling a task, and its refcount?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The behavior of each function is documented in
harness.rs
. There's also a bunch of documentation at the top ofmod.rs
.Basically, each
Task
(orNotified
) object owns a refcount. Various methods will consume the refcount. We want the refcount thattransition_to_notified_for_tracing
creates to be owned by aTask
somehow, rather than implicitly via aRawTask
. This is because it generally makes code much more clear, and it also makes the code more robust towards error paths due to RAII cleanup.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Got it, thanks! So, to summarize, the crash occurred because:
Task
incremented the refcountTask
decremented the refcount...which is one too many decrements.
transition_to_notified_for_tracing
needs to increment the refcount (much liketransition_to_notified_by_ref
), because polling is going to consume that count.