@@ -4,8 +4,8 @@ use std::vec::Vec;
4
4
use std:: boxed:: Box ;
5
5
6
6
extern "Rust" {
7
- fn miri_get_backtrace ( ) -> Box < [ * mut ( ) ] > ;
8
- fn miri_resolve_frame ( version : u8 , ptr : * mut ( ) ) -> MiriFrame ;
7
+ fn miri_get_backtrace ( flags : u64 ) -> Box < [ * mut ( ) ] > ;
8
+ fn miri_resolve_frame ( ptr : * mut ( ) , flags : u64 ) -> MiriFrame ;
9
9
}
10
10
11
11
#[ derive( Debug ) ]
@@ -27,9 +27,8 @@ pub struct Frame {
27
27
pub inner : MiriFrame
28
28
}
29
29
30
- // Miri is single threaded, and the raw
31
- // pointer isn't really a pointer (it's a magic value
32
- // returned by Miri)
30
+ // SAFETY: Miri guarantees that the returned pointer
31
+ // can be used from any thread.
33
32
unsafe impl Send for Frame { }
34
33
unsafe impl Sync for Frame { }
35
34
@@ -52,21 +51,22 @@ impl Frame {
52
51
}
53
52
54
53
pub fn trace < F : FnMut ( & super :: Frame ) -> bool > ( cb : F ) {
55
- // Miri is single threaded
54
+ // SAFETY: Miri guarnatees that the backtrace API functions
55
+ // can be called from any thread.
56
56
unsafe { trace_unsynchronized ( cb) } ;
57
57
}
58
58
59
59
60
60
pub fn resolve_addr ( ptr : * mut c_void ) -> Frame {
61
- let frame: MiriFrame = unsafe { miri_resolve_frame ( 0 , ptr as * mut ( ) ) } ;
61
+ let frame: MiriFrame = unsafe { miri_resolve_frame ( ptr as * mut ( ) , 0 ) } ;
62
62
Frame {
63
63
addr : ptr,
64
64
inner : frame
65
65
}
66
66
}
67
67
68
68
pub unsafe fn trace_unsynchronized < F : FnMut ( & super :: Frame ) -> bool > ( mut cb : F ) {
69
- let frames = miri_get_backtrace ( ) ;
69
+ let frames = miri_get_backtrace ( 0 ) ;
70
70
for ptr in frames. iter ( ) {
71
71
let frame = resolve_addr ( * ptr as * mut c_void ) ;
72
72
cb ( & super :: Frame {
0 commit comments