-
Notifications
You must be signed in to change notification settings - Fork 130
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add failing test of log statement during TLS dtors
- Loading branch information
1 parent
424f031
commit 29b9830
Showing
2 changed files
with
70 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
#[macro_use] | ||
extern crate log; | ||
extern crate env_logger; | ||
|
||
use std::env; | ||
use std::process; | ||
use std::str; | ||
use std::thread; | ||
|
||
struct DropMe; | ||
|
||
impl Drop for DropMe { | ||
fn drop(&mut self) { | ||
debug!("Dropping now"); | ||
} | ||
} | ||
|
||
fn run() { | ||
// Use multiple thread local values to increase the chance that our TLS | ||
// value will get destroyed after the FORMATTER key in the library | ||
thread_local! { | ||
static DROP_ME_0: DropMe = DropMe; | ||
static DROP_ME_1: DropMe = DropMe; | ||
static DROP_ME_2: DropMe = DropMe; | ||
static DROP_ME_3: DropMe = DropMe; | ||
static DROP_ME_4: DropMe = DropMe; | ||
static DROP_ME_5: DropMe = DropMe; | ||
static DROP_ME_6: DropMe = DropMe; | ||
static DROP_ME_7: DropMe = DropMe; | ||
static DROP_ME_8: DropMe = DropMe; | ||
static DROP_ME_9: DropMe = DropMe; | ||
} | ||
DROP_ME_0.with(|_| {}); | ||
DROP_ME_1.with(|_| {}); | ||
DROP_ME_2.with(|_| {}); | ||
DROP_ME_3.with(|_| {}); | ||
DROP_ME_4.with(|_| {}); | ||
DROP_ME_5.with(|_| {}); | ||
DROP_ME_6.with(|_| {}); | ||
DROP_ME_7.with(|_| {}); | ||
DROP_ME_8.with(|_| {}); | ||
DROP_ME_9.with(|_| {}); | ||
} | ||
|
||
fn main() { | ||
env_logger::init(); | ||
if env::var("YOU_ARE_TESTING_NOW").is_ok() { | ||
// Run on a separate thread because TLS values on the main thread | ||
// won't have their destructors run if pthread is used. | ||
// https://doc.rust-lang.org/std/thread/struct.LocalKey.html#platform-specific-behavior | ||
thread::spawn(run).join().unwrap(); | ||
} else { | ||
let exe = env::current_exe().unwrap(); | ||
let out = process::Command::new(exe) | ||
.env("YOU_ARE_TESTING_NOW", "1") | ||
.env("RUST_LOG", "debug") | ||
.output() | ||
.unwrap_or_else(|e| panic!("Unable to start child process: {}", e)); | ||
if !out.status.success() { | ||
println!("test failed: {}", out.status); | ||
println!("--- stdout\n{}", str::from_utf8(&out.stdout).unwrap()); | ||
println!("--- stderr\n{}", str::from_utf8(&out.stderr).unwrap()); | ||
process::exit(1); | ||
} | ||
} | ||
} |