Crate safina_timer[−][src]
Provides async sleep_for
and sleep_until
functions.
This crate is part of safina
,
a safe async runtime.
Features
forbid(unsafe_code)
- Depends only on
std
- Good test coverage (92%)
- Source of time is
std::thread::park_timeout
viastd::sync::mpsc::Receiver::recv_timeout
. - Works with
safina-executor
or any async executor
Limitations
- Building on
stable
requires the featureonce_cell
. This usesonce_cell
crate which contains some unsafe code. This is necessary untilstd::lazy::OnceCell
is stable. - Timers complete around 2ms late, but never early
- Allocates memory
Examples
safina_timer::start_timer_thread(); let duration = Duration::from_secs(10); safina_timer::sleep_for(duration).await;
safina_timer::start_timer_thread(); let deadline = Instant::now() + Duration::from_secs(1); safina_timer::sleep_until(deadline).await;
safina_timer::start_timer_thread(); let deadline = Instant::now() + Duration::from_secs(1); let req = safina_timer::with_deadline( read_request(), deadline).await??; let data = safina_timer::with_deadline( read_data(req), deadline).await??; safina_timer::with_deadline( write_data(data), deadline ).await??; safina_timer::with_deadline( send_response(data), deadline).await??;
safina_timer::start_timer_thread(); let req = safina_timer::with_timeout( read_request(), Duration::from_secs(1) ).await??; let data = safina_timer::with_timeout( read_data(req), Duration::from_secs(2) ).await??; safina_timer::with_timeout( write_data(data), Duration::from_secs(2) ).await??; safina_timer::with_timeout( send_response(data), Duration::from_secs(1) ).await??;
Documentation
Alternatives
- futures-timer
- popular
- Supports: Wasm, Linux, Windows, macOS
- Contains generous amounts of
unsafe
code - Uses
std::thread::park_timeout
as its source of time
- async-io
- popular
- single and repeating timers
- Supports: Linux, Windows, macOS, iOS, Android, and many others.
- Uses polling crate which makes unsafe calls to OS.
- async-timer
- Supports: Linux & Android
- Makes unsafe calls to OS
- tokio
- very popular
- single and repeating timers
- Supports: Linux, macOS, other unix-like operating systems, Windows
- Fast, internally complicated, and full of
unsafe
- embedded-async-timer
no_std
- Supports
bare_metal
Changelog
- v0.1.7 - Support stable with rust 1.51 and
once_cell
. - v0.1.6 - Fix tests broken by
safina-async-test
changes - v0.1.5 - Update docs
- v0.1.4 - Upgrade to new safina-executor version which removes need for
Box::pin
. - v0.1.3 - Add badges to readme
- v0.1.2
- Update
with_deadline
andwith_timeout
:- Make them panic on
TimerThreadNotStarted
error and return newDeadlineExceeded
struct instead ofDeadlineError
enum. This allows callers to write a match clause likeErr(DeadlineExceeded)
. - Make them use
std::boxed::Box::pin
so callers don’t have to.
- Make them panic on
- Make
sleep_until
andsleep_for
return()
and panic ifstart_timer_thread()
has not been called.
- Update
- v0.1.1
- Use most recent waker passed to
SleepFuture::poll
, as required by thestd::future::Future::poll
contract. - Add
with_deadline
andwith_timeout
functions.
- Use most recent waker passed to
- v0.1.0 - First published version
TO DO
- DONE - Implement
sleep_until
- DONE - Implement
sleep_for
- DONE - Add tests
- DONE - Add docs
- DONE - Publish on crates.io
- DONE - Add a way to build on stable, using unsafe
once_cell
. - DONE - Make tests run on stable.
- Add a way to schedule jobs (
FnOnce
structs).
Release Process
- Edit
Cargo.toml
and bump version number. - Run
./release.sh
Structs
DeadlineExceeded | |
DeadlineFuture | A future wrapper that returns |
SleepFuture | A future that completes after the specified time. |
TimerThreadNotStarted | Call |
Enums
DeadlineError |
DeadlineError::TimerThreadNotStarted DeadlineError::DeadlineExceeded |
Functions
sleep_for | Returns |
sleep_until | Returns after |
start_timer_thread | Starts the worker thread, if it’s not already started.
You must call this before calling |
with_deadline | Awaits |
with_timeout | Awaits |