backtrace/symbolize/gimli/
mmap_unix.rs
1use super::mystd::fs::File;
2use super::mystd::os::unix::prelude::*;
3use core::ops::Deref;
4use core::ptr;
5use core::slice;
6
7#[cfg(not(all(target_os = "linux", target_env = "gnu")))]
8use libc::mmap as mmap64;
9#[cfg(all(target_os = "linux", target_env = "gnu"))]
10use libc::mmap64;
11
12pub struct Mmap {
13 ptr: *mut libc::c_void,
14 len: usize,
15}
16
17impl Mmap {
18 pub unsafe fn map(file: &File, len: usize) -> Option<Mmap> {
19 let ptr = mmap64(
20 ptr::null_mut(),
21 len,
22 libc::PROT_READ,
23 libc::MAP_PRIVATE,
24 file.as_raw_fd(),
25 0,
26 );
27 if ptr == libc::MAP_FAILED {
28 return None;
29 }
30 Some(Mmap { ptr, len })
31 }
32}
33
34impl Deref for Mmap {
35 type Target = [u8];
36
37 fn deref(&self) -> &[u8] {
38 unsafe { slice::from_raw_parts(self.ptr as *const u8, self.len) }
39 }
40}
41
42impl Drop for Mmap {
43 fn drop(&mut self) {
44 unsafe {
45 let r = libc::munmap(self.ptr, self.len);
46 debug_assert_eq!(r, 0);
47 }
48 }
49}