mirror of
https://github.com/bertptrs/beul.git
synced 2025-12-25 12:40:31 +01:00
Merge #3
3: Make use of pin! stabilization r=bertptrs a=bertptrs With Rust 1.68 `std::pin::pin!` is stable therefore we can now use it to get rid of a pesky heap allocation in the executor. This requires bumping MSRV to 1.68, but I feel this should be the last time that will happen, so after this I can cut the 1.0. Co-authored-by: Bert Peters <bert@bertptrs.nl>
This commit is contained in:
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -39,7 +39,7 @@ jobs:
|
||||
|
||||
- uses: dtolnay/rust-toolchain@v1
|
||||
with:
|
||||
toolchain: "1.51"
|
||||
toolchain: "1.68"
|
||||
|
||||
- run: cargo test
|
||||
|
||||
|
||||
@@ -6,6 +6,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Changed
|
||||
|
||||
- Use dynamic dispatch internally to save on code gen. External API unchanged.
|
||||
- No longer heap-allocate futures.
|
||||
|
||||
### Breaking
|
||||
|
||||
- Minimum supported Rust version bumped to 1.68.
|
||||
|
||||
## [0.1.1] - 2022-09-05
|
||||
|
||||
### Fixed
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
[package]
|
||||
name = "beul"
|
||||
version = "0.1.1"
|
||||
# Edition 2021 is not available in MSRV
|
||||
edition = "2018"
|
||||
edition = "2021"
|
||||
license = "MIT OR Apache-2.0"
|
||||
description = "It executes futures"
|
||||
repository = "https://github.com/bertptrs/beul/"
|
||||
rust-version = "1.51"
|
||||
rust-version = "1.68"
|
||||
authors = [
|
||||
"Bert Peters",
|
||||
]
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
# Beul
|
||||
|
||||
Beul is a minimalistic futures executor. No dependencies, no unsafe rust.
|
||||
Beul is a minimalistic futures executor. No dependencies, no unsafe rust. It simply executes
|
||||
futures.
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -12,8 +13,8 @@ beul::execute(async {});
|
||||
|
||||
### Backwards compatibility
|
||||
|
||||
This crate requires at least Rust 1.51, due to its reliance on [Wake]. Increases in this version
|
||||
will be considered breaking changes. This crate follows semantic versioning.
|
||||
This crate requires at least Rust 1.68, due to its reliance on [std::pin::pin!]. Increases in this
|
||||
version will be considered breaking changes. This crate follows semantic versioning.
|
||||
|
||||
### Limitations
|
||||
|
||||
@@ -37,4 +38,4 @@ work by you, as defined in the Apache-2.0 license, shall be dual licensed as abo
|
||||
additional terms or conditions.
|
||||
|
||||
[Tokio]: https://tokio.rs/
|
||||
[Wake]: https://doc.rust-lang.org/std/task/trait.Wake.html
|
||||
[std::pin::pin!]: https://doc.rust-lang.org/std/pin/macro.pin.html
|
||||
|
||||
10
src/lib.rs
10
src/lib.rs
@@ -16,6 +16,7 @@
|
||||
//! ```
|
||||
#![forbid(unsafe_code)]
|
||||
use std::future::Future;
|
||||
use std::pin::Pin;
|
||||
use std::sync::Arc;
|
||||
use std::sync::Condvar;
|
||||
use std::sync::Mutex;
|
||||
@@ -60,10 +61,15 @@ impl Wake for CondvarWake {
|
||||
}
|
||||
|
||||
/// Block on specified [`Future`].
|
||||
///
|
||||
/// The future will be polled until completion on the current thread.
|
||||
pub fn execute<T>(f: impl Future<Output = T>) -> T {
|
||||
// TODO: replace with std::pin::pin once it gets stabilized
|
||||
let mut pinned = Box::pin(f);
|
||||
// Use dynamic dispatch to save on codegen
|
||||
poll(std::pin::pin!(f))
|
||||
}
|
||||
|
||||
/// Poll a future until completion.
|
||||
fn poll<T>(mut pinned: Pin<&mut dyn Future<Output = T>>) -> T {
|
||||
let wake = Arc::new(CondvarWake::default());
|
||||
let waker = Waker::from(Arc::clone(&wake));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user