ACP: add Thread::into_raw and Thread::from_raw · Issue #200 · rust-lang/libs-team (original) (raw)

Proposal

Problem statement

It should be possible to convert a Thread from/to a raw pointer for passing thread handles across API boundaries in an opaque manner.

Motivation, use-cases

Primary use case would be optimizing small futures executors. pollster - a minimalistic futures executor with over 1 million downloads would be a direct beneficiary of this. Currently, pollster needs to heap allocate a signal on every future being executed. Alternative would be to use a thread_local! store of static signals/thread handles, but why bother, when a Thread is already that?

As of today, Thread is merely a newtype around opaque Arc, and I was able to abuse this knowledge to remove heap allocations from pollster and speed it up by up to 2x (zesterer/pollster#19). Thus, it would be trivial to add methods to convert the thread handle into a raw pointer, and go the other way around.

Additional use cases would be passing thread handles across FFI-boundary, which would enable better interoperability with other languages and dynamically loaded Rust libraries.

Solution sketches

We would add these functions to Thread implementation:

#[must_use] pub fn into_raw(self) -> *const () { let inner = unsafe { Pin::into_inner_unchecked(self.inner) }; Arc::into_raw(inner) as *const () }

pub unsafe fn from_raw(raw: *const ()) -> Thread { Thread { inner: Pin::new_unchecked(Arc::from_raw(raw as *const Inner)) } }

Original PR to pollster: zesterer/pollster#14
Prior implementation of this ACP: rust-lang/rust#97524
Implementation of this ACP (I closed it as duplicate): rust-lang/rust#109794