Skip to content

Commit 526e187

Browse files
committed
Add thread Builder::no_hooks().
1 parent 79e909b commit 526e187

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

library/std/src/thread/mod.rs

+19-3
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,8 @@ pub struct Builder {
269269
name: Option<String>,
270270
// The size of the stack for the spawned thread in bytes
271271
stack_size: Option<usize>,
272+
// Skip running and inheriting the thread spawn hooks
273+
no_hooks: bool,
272274
}
273275

274276
impl Builder {
@@ -292,7 +294,7 @@ impl Builder {
292294
/// ```
293295
#[stable(feature = "rust1", since = "1.0.0")]
294296
pub fn new() -> Builder {
295-
Builder { name: None, stack_size: None }
297+
Builder { name: None, stack_size: None, no_hooks: false }
296298
}
297299

298300
/// Names the thread-to-be. Currently the name is used for identification
@@ -348,6 +350,16 @@ impl Builder {
348350
self
349351
}
350352

353+
/// Disables running and inheriting [spawn hooks](add_spawn_hook).
354+
///
355+
/// Use this if the parent thread is in no way relevant for the child thread.
356+
/// For example, when lazily spawning threads for a thread pool.
357+
#[unstable(feature = "thread_spawn_hook", issue = "none")]
358+
pub fn no_hooks(mut self) -> Builder {
359+
self.no_hooks = true;
360+
self
361+
}
362+
351363
/// Spawns a new thread by taking ownership of the `Builder`, and returns an
352364
/// [`io::Result`] to its [`JoinHandle`].
353365
///
@@ -472,7 +484,7 @@ impl Builder {
472484
T: Send + 'a,
473485
'scope: 'a,
474486
{
475-
let Builder { name, stack_size } = self;
487+
let Builder { name, stack_size, no_hooks } = self;
476488

477489
let stack_size = stack_size.unwrap_or_else(|| {
478490
static MIN: AtomicUsize = AtomicUsize::new(0);
@@ -498,7 +510,11 @@ impl Builder {
498510
)
499511
});
500512

501-
let hooks = spawnhook::run_spawn_hooks(&my_thread);
513+
let hooks = if no_hooks {
514+
spawnhook::ChildSpawnHooks::default()
515+
} else {
516+
spawnhook::run_spawn_hooks(&my_thread)
517+
};
502518

503519
let their_thread = my_thread.clone();
504520

library/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)