Hi all,
I have faced with the strange issue ...
LocalKey drops from wrong thread, but I need that LocalKey drops from thread where it was created !!
How to do this ? It is possible ?
I need it because in drop
I have JoinHandle and it turns that second thread tries to close LocalKey from main thread which contain JoinHandle to it ... and when I call .join
on JoinHandle app crashed because this thread already closed by application ...
use std::thread::JoinHandle;
use std::cell::RefCell;
fn do_nothing() {
loop {
}
}
struct LocalStrategy {
jh: RefCell<Option<JoinHandle<()>>>,
}
impl Drop for LocalStrategy {
fn drop(&mut self) {
if let Some(join_handle) = self.jh.borrow_mut().take() {
join_handle.join();
}
}
}
thread_local! {
static LOCAL_STRATEGY: LocalStrategy = {
LocalStrategy {
jh: RefCell::new(Some(std::thread::spawn(|| {
do_nothing();
})))
}
};
}
fn main() {
LOCAL_STRATEGY.with(|lc| {
});
println!("Hello, crash!");
}
crash backtrace:
Finished dev [unoptimized + debuginfo] target(s) in 0.51s
Running `target\debug\untitled3.exe`
Hello, crash!
thread '<unnamed>' panicked at 'called `Option::unwrap()` on a `None` value', C:\Users\RedRa\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib/rustlib/src/rust\src\libstd\thread\mod.rs:1357:18
stack backtrace:
0: backtrace::backtrace::trace_unsynchronized
at C:\Users\VssAdministrator\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.46\src\backtrace\mod.rs:66
1: std::sys_common::backtrace::_print_fmt
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\sys_common\backtrace.rs:78
2: std::sys_common::backtrace::_print::{{impl}}::fmt
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\sys_common\backtrace.rs:59
3: core::fmt::write
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libcore\fmt\mod.rs:1069
4: std::io::Write::write_fmt<std::sys::windows::stdio::Stderr>
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\io\mod.rs:1532
5: std::sys_common::backtrace::_print
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\sys_common\backtrace.rs:62
6: std::sys_common::backtrace::print
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\sys_common\backtrace.rs:49
7: std::panicking::default_hook::{{closure}}
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\panicking.rs:198
8: std::panicking::default_hook
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\panicking.rs:218
9: std::panicking::rust_panic_with_hook
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\panicking.rs:477
10: std::panicking::begin_panic_handler
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\panicking.rs:385
11: core::panicking::panic_fmt
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libcore\panicking.rs:89
12: core::panicking::panic
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libcore\panicking.rs:52
13: core::option::Option<core::result::Result<(), alloc::boxed::Box<Any>>>::unwrap<core::result::Result<(), alloc::boxed::Box<Any>>>
at C:\Users\RedRa\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libcore\macros\mod.rs:10
14: std::thread::JoinInner<()>::join<()>
at C:\Users\RedRa\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libstd\thread\mod.rs:1357
15: std::thread::JoinHandle<()>::join<()>
at C:\Users\RedRa\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libstd\thread\mod.rs:1487
16: untitled3::{{impl}}::drop
at .\src\main.rs:16
17: core::ptr::drop_in_place<untitled3::LocalStrategy>
at C:\Users\RedRa\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libcore\ptr\mod.rs:178
18: core::ptr::drop_in_place<core::option::Option<untitled3::LocalStrategy>>
at C:\Users\RedRa\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libcore\ptr\mod.rs:178
19: core::mem::drop<core::option::Option<untitled3::LocalStrategy>>
at C:\Users\RedRa\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libcore\mem\mod.rs:873
20: std::thread::local::fast::destroy_value<untitled3::LocalStrategy>
at C:\Users\RedRa\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libstd\thread\local.rs:460
21: std::sys_common::thread_local::register_dtor_fallback::run_dtors
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\sys_common\thread_local.rs:260
22: std::sys::windows::thread_local::run_dtors
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\sys\windows\thread_local.rs:229
23: std::sys::windows::thread_local::on_tls_callback
at /rustc/f05a5240440b3eaef1684a7965860fab40301947\/src\libstd\sys\windows\thread_local.rs:198
24: RtlActivateActivationContextUnsafeFast
25: RtlActivateActivationContextUnsafeFast
26: LdrShutdownProcess
27: RtlExitUserProcess
28: ExitProcess
29: o_free
30: exit
31: __scrt_common_main_seh
at d:\agent\_work\4\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:295
32: BaseThreadInitThunk
33: RtlUserThreadStart
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.