Skip to content

Commit a42af06

Browse files
committed
Add thread Builder::no_hooks().
1 parent 49ac15b commit a42af06

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

std/src/thread/mod.rs

+19-3
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ pub struct Builder {
264264
name: Option<String>,
265265
// The size of the stack for the spawned thread in bytes
266266
stack_size: Option<usize>,
267+
// Skip running and inheriting the thread spawn hooks
268+
no_hooks: bool,
267269
}
268270

269271
impl Builder {
@@ -287,7 +289,7 @@ impl Builder {
287289
/// ```
288290
#[stable(feature = "rust1", since = "1.0.0")]
289291
pub fn new() -> Builder {
290-
Builder { name: None, stack_size: None }
292+
Builder { name: None, stack_size: None, no_hooks: false }
291293
}
292294

293295
/// Names the thread-to-be. Currently the name is used for identification
@@ -343,6 +345,16 @@ impl Builder {
343345
self
344346
}
345347

348+
/// Disables running and inheriting [spawn hooks](add_spawn_hook).
349+
///
350+
/// Use this if the parent thread is in no way relevant for the child thread.
351+
/// For example, when lazily spawning threads for a thread pool.
352+
#[unstable(feature = "thread_spawn_hook", issue = "none")]
353+
pub fn no_hooks(mut self) -> Builder {
354+
self.no_hooks = true;
355+
self
356+
}
357+
346358
/// Spawns a new thread by taking ownership of the `Builder`, and returns an
347359
/// [`io::Result`] to its [`JoinHandle`].
348360
///
@@ -465,7 +477,7 @@ impl Builder {
465477
F: Send,
466478
T: Send,
467479
{
468-
let Builder { name, stack_size } = self;
480+
let Builder { name, stack_size, no_hooks } = self;
469481

470482
let stack_size = stack_size.unwrap_or_else(|| {
471483
static MIN: AtomicUsize = AtomicUsize::new(0);
@@ -491,7 +503,11 @@ impl Builder {
491503
None => Thread::new_unnamed(id),
492504
};
493505

494-
let hooks = spawnhook::run_spawn_hooks(&my_thread);
506+
let hooks = if no_hooks {
507+
spawnhook::ChildSpawnHooks::default()
508+
} else {
509+
spawnhook::run_spawn_hooks(&my_thread)
510+
};
495511

496512
let their_thread = my_thread.clone();
497513

std/src/thread/spawnhook.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ where
104104
/// Called on the parent thread.
105105
///
106106
/// Returns the functions to be called on the newly spawned thread.
107-
pub(super) fn run_spawn_hooks(thread: &Thread) -> SpawnHookResults {
107+
pub(super) fn run_spawn_hooks(thread: &Thread) -> ChildSpawnHooks {
108108
// Get a snapshot of the spawn hooks.
109109
// (Increments the refcount to the first node.)
110110
let hooks = SPAWN_HOOKS.with(|hooks| {
@@ -121,19 +121,20 @@ pub(super) fn run_spawn_hooks(thread: &Thread) -> SpawnHookResults {
121121
}
122122
// Pass on the snapshot of the hooks and the results to the new thread,
123123
// which will then run SpawnHookResults::run().
124-
SpawnHookResults { hooks, to_run }
124+
ChildSpawnHooks { hooks, to_run }
125125
}
126126

127127
/// The results of running the spawn hooks.
128128
///
129129
/// This struct is sent to the new thread.
130130
/// It contains the inherited hooks and the closures to be run.
131-
pub(super) struct SpawnHookResults {
131+
#[derive(Default)]
132+
pub(super) struct ChildSpawnHooks {
132133
hooks: SpawnHooks,
133134
to_run: Vec<Box<dyn FnOnce() + Send>>,
134135
}
135136

136-
impl SpawnHookResults {
137+
impl ChildSpawnHooks {
137138
// This is run on the newly spawned thread, directly at the start.
138139
pub(super) fn run(self) {
139140
SPAWN_HOOKS.set(self.hooks);

0 commit comments

Comments
 (0)