Skip to content

Commit d047870

Browse files
ohadravidRalfJung
authored andcommitted
Test accessing a thread local in a different thread when loading a cdylib
1 parent 7d5a8bb commit d047870

4 files changed

Lines changed: 47 additions & 10 deletions

File tree

tests/run-make/dynamic-loading-cdylib/foo.rs

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,36 @@ pub extern "C" fn extern_fn_1(a: u32, b: u32) -> u32 {
66
a + b
77
}
88

9-
struct NotifyOnDrop;
9+
#[derive(Default)]
10+
struct NotifyOnDrop {
11+
last_result: std::cell::Cell<u32>,
12+
}
13+
14+
impl NotifyOnDrop {
15+
fn save_and_print(&self, result: u32) {
16+
self.last_result.set(result);
17+
}
18+
}
1019

1120
impl Drop for NotifyOnDrop {
1221
fn drop(&mut self) {
13-
println!("drop");
22+
println!("dropping, last result: {}", self.last_result.get());
1423
}
1524
}
1625

26+
thread_local! {
27+
static FOO: NotifyOnDrop = NotifyOnDrop::default();
28+
}
29+
1730
#[no_mangle]
1831
pub extern "C" fn extern_fn_2(a: u32, b: u32) -> u32 {
19-
thread_local!(static FOO: NotifyOnDrop = NotifyOnDrop);
20-
FOO.with(|_foo| {});
21-
println!("extern_fn_2");
22-
a * b
32+
let result = a * b;
33+
34+
FOO.with(|foo| {
35+
foo.save_and_print(result);
36+
});
37+
38+
println!("extern_fn_2({a}, {b})");
39+
40+
result
2341
}

tests/run-make/dynamic-loading-cdylib/load_and_unload.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,15 @@ fn main() {
101101
let result = unsafe { extern_fn_2(2, 3) };
102102
println!("result of extern_fn_2(2, 3): {}", result);
103103

104+
println!("spawning thread");
105+
std::thread::spawn(move || {
106+
let result = unsafe { extern_fn_2(4, 5) };
107+
println!("result of extern_fn_2(4, 5) in other thread: {}", result);
108+
})
109+
.join()
110+
.expect("Thread panicked");
111+
println!("thread joined");
112+
104113
libloading::unload(foo);
105114
println!("unloaded library");
106115
}
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
loaded library
22
extern_fn_1
33
result of extern_fn_1(2, 3): 5
4-
extern_fn_2
4+
extern_fn_2(2, 3)
55
result of extern_fn_2(2, 3): 6
6+
spawning thread
7+
extern_fn_2(4, 5)
8+
result of extern_fn_2(4, 5) in other thread: 20
9+
dropping, last result: 20
10+
thread joined
611
unloaded library
7-
drop
12+
dropping, last result: 6
Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
loaded library
22
extern_fn_1
33
result of extern_fn_1(2, 3): 5
4-
extern_fn_2
4+
extern_fn_2(2, 3)
55
result of extern_fn_2(2, 3): 6
6-
drop
6+
spawning thread
7+
extern_fn_2(4, 5)
8+
result of extern_fn_2(4, 5) in other thread: 20
9+
dropping, last result: 20
10+
thread joined
11+
dropping, last result: 6
712
unloaded library

0 commit comments

Comments
 (0)