util: add track_caller to public APIs #4785
Merged
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.
Motivation
When a user of tokio calls a function that panics when misused (e.g. calling
DelayQueue::insert_at
with a an instant 100 years in the future) then the usercurrently sees the line number of the panic call inside tokio. It would be more
informative for the user to see the place where they called the panicking function.
It is still possible for the user to see the full stack trace by setting the
environment variable RUST_BACKLOG=1, so no useful information is
hidden.
This change is the second step in closing #4413 (after #4772), this change
is for the tokio-util crate.
Note that there was an earlier PR (#4445) to work on this issue for the tokio-util
crate, but it hasn't seen much work recently and after looking into it, I found that
these change in the main crate are necessary prerequisites.
Solution
Functions that may panic can be annotated with
#[track_caller]
so thatin the event of a panic, the function where the user called the
panicking function is shown instead of the file and line within Tokio
source.
This change adds
#[track_caller]
to all the non-unstable public APIs intokio-util where the documentation describes how the function may panic
due to incorrect context or inputs.
In one place, an assert was added where the described behavior appeared
not to be implemented. The documentation for
DelayQueue::reserve
states that the function will panic if the new capacity exceeds the
maximum number of entries the queue can contain. However, the function
didn't panic until a higher number caused by an allocation failure. This
is inconsistent with
DelayQueue::insert_at
which will panic if thenumber of entries were to go over MAX_ENTRIES.
Tests are included to cover each potentially panicking function.
Refs: #4413