Auto merge of #127397 - jyn514:multi-thread-panic-hook, r=workingjubilee · model-checking/verify-rust-std@c79e003 (original) (raw)

`@@ -7,44 +7,41 @@ use crate::fmt;

`

7

7

`use crate::io;

`

8

8

`use crate::io::prelude::*;

`

9

9

`use crate::path::{self, Path, PathBuf};

`

10

``

`-

use crate::sync::{Mutex, PoisonError};

`

``

10

`+

use crate::sync::{Mutex, MutexGuard, PoisonError};

`

11

11

``

12

12

`/// Max number of frames to print.

`

13

13

`const MAX_NB_FRAMES: usize = 100;

`

14

14

``

15

``

`-

pub fn lock() -> impl Drop {

`

``

15

`+

pub(crate) struct BacktraceLock<'a>(#[allow(dead_code)] MutexGuard<'a, ()>);

`

``

16

+

``

17

`+

pub(crate) fn lock<'a>() -> BacktraceLock<'a> {

`

16

18

`static LOCK: Mutex<()> = Mutex::new(());

`

17

``

`-

LOCK.lock().unwrap_or_else(PoisonError::into_inner)

`

``

19

`+

BacktraceLock(LOCK.lock().unwrap_or_else(PoisonError::into_inner))

`

18

20

`}

`

19

21

``

20

``

`-

/// Prints the current backtrace.

`

21

``

`-

pub fn print(w: &mut dyn Write, format: PrintFmt) -> io::Result<()> {

`

22

``

`-

// There are issues currently linking libbacktrace into tests, and in

`

23

``

`-

// general during std's own unit tests we're not testing this path. In

`

24

``

`-

// test mode immediately return here to optimize away any references to the

`

25

``

`-

// libbacktrace symbols

`

26

``

`-

if cfg!(test) {

`

27

``

`-

return Ok(());

`

28

``

`-

}

`

29

``

-

30

``

`-

// Use a lock to prevent mixed output in multithreading context.

`

31

``

`` -

// Some platforms also requires it, like SymFromAddr on Windows.

``

32

``

`-

unsafe {

`

33

``

`-

let _lock = lock();

`

34

``

`-

_print(w, format)

`

35

``

`-

}

`

36

``

`-

}

`

``

22

`+

impl BacktraceLock<'_> {

`

``

23

`+

/// Prints the current backtrace.

`

``

24

`+

///

`

``

25

`+

/// NOTE: this function is not Sync. The caller must hold a mutex lock, or there must be only one thread in the program.

`

``

26

`+

pub(crate) fn print(&mut self, w: &mut dyn Write, format: PrintFmt) -> io::Result<()> {

`

``

27

`+

// There are issues currently linking libbacktrace into tests, and in

`

``

28

`+

// general during std's own unit tests we're not testing this path. In

`

``

29

`+

// test mode immediately return here to optimize away any references to the

`

``

30

`+

// libbacktrace symbols

`

``

31

`+

if cfg!(test) {

`

``

32

`+

return Ok(());

`

``

33

`+

}

`

37

34

``

38

``

`-

unsafe fn _print(w: &mut dyn Write, format: PrintFmt) -> io::Result<()> {

`

39

``

`-

struct DisplayBacktrace {

`

40

``

`-

format: PrintFmt,

`

41

``

`-

}

`

42

``

`-

impl fmt::Display for DisplayBacktrace {

`

43

``

`-

fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {

`

44

``

`-

unsafe { _print_fmt(fmt, self.format) }

`

``

35

`+

struct DisplayBacktrace {

`

``

36

`+

format: PrintFmt,

`

``

37

`+

}

`

``

38

`+

impl fmt::Display for DisplayBacktrace {

`

``

39

`+

fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {

`

``

40

`+

unsafe { _print_fmt(fmt, self.format) }

`

``

41

`+

}

`

45

42

`}

`

``

43

`+

write!(w, "{}", DisplayBacktrace { format })

`

46

44

`}

`

47

``

`-

write!(w, "{}", DisplayBacktrace { format })

`

48

45

`}

`

49

46

``

50

47

`unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::Result {

`