From 89052df41b2d13f244459daf08a19aadfb1781aa Mon Sep 17 00:00:00 2001 From: Thomas de Zeeuw Date: Sat, 21 Dec 2024 17:31:58 +0100 Subject: [PATCH 1/3] Remove stable const_optio nightly feature --- rt/src/lib.rs | 1 - src/lib.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/rt/src/lib.rs b/rt/src/lib.rs index 14492c98..1956873a 100644 --- a/rt/src/lib.rs +++ b/rt/src/lib.rs @@ -175,7 +175,6 @@ #![feature( async_iterator, - const_option, doc_auto_cfg, doc_cfg_hide, extract_if, diff --git a/src/lib.rs b/src/lib.rs index a35a4ffc..ef108f51 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,7 +45,7 @@ //! This crate has one optional feature: `test`. The `test` feature will enable //! the `test` module which contains testing facilities. -#![feature(const_option, doc_auto_cfg, doc_cfg_hide, never_type)] +#![feature(doc_auto_cfg, doc_cfg_hide, never_type)] #![warn( anonymous_parameters, bare_trait_objects, From a90ddcd5b5a2495a883b34f6854bffc8e4e45dc9 Mon Sep 17 00:00:00 2001 From: Thomas de Zeeuw Date: Sat, 21 Dec 2024 17:49:13 +0100 Subject: [PATCH 2/3] Replace transmute with Thread::{into,from}_raw Makes things a little safer. --- src/lib.rs | 2 +- src/sync.rs | 37 ++++++++++++++++++++++--------------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ef108f51..476ce159 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,7 +45,7 @@ //! This crate has one optional feature: `test`. The `test` feature will enable //! the `test` module which contains testing facilities. -#![feature(doc_auto_cfg, doc_cfg_hide, never_type)] +#![feature(doc_auto_cfg, doc_cfg_hide, never_type, thread_raw)] #![warn( anonymous_parameters, bare_trait_objects, diff --git a/src/sync.rs b/src/sync.rs index 393a6227..c5ea3a30 100644 --- a/src/sync.rs +++ b/src/sync.rs @@ -46,12 +46,12 @@ //! ``` use std::future::Future; +use std::io; use std::panic::{self, AssertUnwindSafe}; use std::pin::pin; use std::task::{self, Poll, RawWaker, RawWakerVTable}; use std::thread::{self, Thread}; use std::time::{Duration, Instant}; -use std::{io, ptr}; use heph_inbox::Receiver; use heph_inbox::{self as inbox, ReceiverConnected}; @@ -438,9 +438,7 @@ impl SyncWaker { /// Returns itself as `task::RawWaker` data. fn into_data(self) -> *const () { - // SAFETY: this is not safe. This only works because `Thread` uses - // `Pin>`, which is a pointer underneath. - unsafe { std::mem::transmute(self) } + self.handle.into_raw() } /// Inverse of [`SyncWaker::into_data`]. @@ -449,16 +447,25 @@ impl SyncWaker { /// /// `data` MUST be created by [`SyncWaker::into_data`]. unsafe fn from_data(data: *const ()) -> SyncWaker { - // SAFETY: inverse of `into_data`, see that for more info. - unsafe { std::mem::transmute(data) } + SyncWaker { + // SAFETY: caller must ensure that `data` is created by + // `SyncWaker::into_data`, which forfills all requirements for + // `Thread::from_raw`. + handle: unsafe { Thread::from_raw(data) }, + } } - /// Same as [`SyncWaker::from_data`], but returns a reference instead of an - /// owned `SyncWaker`. - unsafe fn from_data_ref(data: &*const ()) -> &SyncWaker { - // SAFETY: inverse of `into_data`, see that for more info, also see - // `from_data`. - &*(ptr::from_ref(data).cast()) + /// Same as [`SyncWaker::from_data`], but doesn't invalidates `data`. + unsafe fn from_data_ref(data: *const ()) -> SyncWaker { + // SAFETY: THIS IS INCORRECT. + // + // If anything between `SyncWaker::from_data` and `waker.into_waker` + // panics this will go badly. + let waker = unsafe { SyncWaker::from_data(data) }; + let clone = waker.clone(); + let out = waker.into_data(); + assert!(out == data); // Need to ensure that `data` is valid. + clone } const VTABLE: RawWakerVTable = RawWakerVTable::new( @@ -469,8 +476,8 @@ impl SyncWaker { ); unsafe fn clone(data: *const ()) -> RawWaker { - let waker = SyncWaker::from_data_ref(&data); - let data = waker.clone().into_data(); + let waker = SyncWaker::from_data_ref(data); + let data = waker.into_data(); RawWaker::new(data, &SyncWaker::VTABLE) } @@ -479,7 +486,7 @@ impl SyncWaker { } unsafe fn wake_by_ref(data: *const ()) { - SyncWaker::from_data_ref(&data).handle.unpark(); + SyncWaker::from_data_ref(data).handle.unpark(); } unsafe fn drop(data: *const ()) { From aeb612e88bc844e43308663c82a1fb164e1e1d7c Mon Sep 17 00:00:00 2001 From: Thomas de Zeeuw Date: Sat, 21 Dec 2024 17:55:02 +0100 Subject: [PATCH 3/3] Fix & ignore Clippy lints --- Makefile.include | 1 + rt/src/trace.rs | 1 + src/future.rs | 5 +---- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Makefile.include b/Makefile.include index d5674c47..e62231ff 100644 --- a/Makefile.include +++ b/Makefile.include @@ -127,6 +127,7 @@ clippy: --allow clippy::new-without-default \ --allow clippy::option-if-let-else \ --allow clippy::redundant-pub-crate \ + --allow clippy::used-underscore-items \ --allow clippy::use-self \ doc: diff --git a/rt/src/trace.rs b/rt/src/trace.rs index 3782d1f3..f718bd35 100644 --- a/rt/src/trace.rs +++ b/rt/src/trace.rs @@ -345,6 +345,7 @@ impl Clone for Log { /// Start timing an event (using [`EventTiming`]) if we're tracing, i.e. if /// `log` is `Some`. +#[allow(clippy::ref_option)] pub(crate) fn start(log: &Option) -> Option where L: TraceLog, diff --git a/src/future.rs b/src/future.rs index 876020d2..2781ddc2 100644 --- a/src/future.rs +++ b/src/future.rs @@ -280,10 +280,7 @@ impl ActorFutureBuilder { let (inbox, sender, receiver) = inbox::Manager::new_channel(self.inbox_size.get()); let actor_ref = ActorRef::local(sender); let ctx = actor::Context::new(receiver, rt.clone()); - let actor = match new_actor.new(ctx, argument) { - Ok(actor) => actor, - Err(err) => return Err(err), - }; + let actor = new_actor.new(ctx, argument)?; let future = ActorFuture { supervisor, new_actor,