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}