5 releases
0.2.1 | Apr 16, 2023 |
---|---|
0.2.0 |
|
0.1.5 | Jun 27, 2022 |
0.1.4 | Apr 28, 2021 |
0.1.3 |
|
#265 in Concurrency
193 downloads per month
Used in 4 crates
(3 directly)
20KB
254 lines
permit::Permit
is a struct for cancelling operations.
Use Cases
- Graceful server shutdown
- Cancel operations that take too long
- Stop in-flight operations when revoking authorization
Features
- Subordinate permits. Revoking a permit also revokes its subordinates, recursively.
- Drop a permit to revoke its subordinates, recursively.
- Wait for all subordinate permits to drop.
- Implements
Future
. You canawait
a permit and return when it is revoked. - Similar to Golang's
context
- Depends only on
std
. forbid(unsafe_code)
- 100% test coverage
Limitations
- Does not hold data values
- Allocates. Uses
alloc::sync::Arc
.
Alternatives
async_ctx
- Good API
- Async only
stopper
- Async only
io-context
- Holds Any values
- Unmaintained
ctx
Related Crates
Example
Graceful shutdown:
let top_permit = permit::Permit::new();
// Start some worker threads.
for _ in 0..5 {
let permit = top_permit.new_sub();
std::thread::spawn(move || {
while !permit.is_revoked() {
// ...
}
});
}
wait_for_shutdown_signal();
// Revoke all thread permits and wait for them to
// finish and drop their permits.
top_permit
.revoke()
.wait_subs_timeout(Duration::from_secs(3))
.unwrap();
Cargo Geiger Safety Report
Metric output format: x/y
x = unsafe code used by the build
y = total unsafe code found in the crate
Symbols:
🔒 = No `unsafe` usage found, declares #![forbid(unsafe_code)]
❓ = No `unsafe` usage found, missing #![forbid(unsafe_code)]
☢️ = `unsafe` usage found
Functions Expressions Impls Traits Methods Dependency
0/0 0/0 0/0 0/0 0/0 🔒 permit 0.2.1
0/0 0/0 0/0 0/0 0/0
Changelog
- v0.2.1 - Fix bug where
sleep
andsleep_until
would sometimes not return early. - v0.2.0
- Rename
try_wait_for
towait_subs_timeout
- Rename
try_wait_until
towait_subs_deadline
- Replace spinlock with Condvar in
wait*
methods - Remove
wait
- Add
sleep
andsleep_until
- Rename
- v0.1.5 - Implement
Debug
- v0.1.4 - Fix bug
where
revoke()
and thenwait()
would not wait. - v0.1.3
- Don't keep or wake stale
std::task::Waker
structs. - Eliminate race that causes unnecessary wake.
- Don't keep or wake stale
- v0.1.2 - Implement
Future
- v0.1.1 - Make
revoke
return&Self
- v0.1.0 - Initial version
License: Apache-2.0