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, offset: u64) -> Option<Mmap> {
19 let ptr = unsafe {
20 mmap64(
21 ptr::null_mut(),
22 len,
23 libc::PROT_READ,
24 libc::MAP_PRIVATE,
25 file.as_raw_fd(),
26 offset.try_into().ok()?,
27 )
28 };
29 if ptr == libc::MAP_FAILED {
30 return None;
31 }
32 Some(Mmap { ptr, len })
33 }
34}
35
36impl Deref for Mmap {
37 type Target = [u8];
38
39 fn deref(&self) -> &[u8] {
40 unsafe { slice::from_raw_parts(self.ptr as *const u8, self.len) }
41 }
42}
43
44impl Drop for Mmap {
45 fn drop(&mut self) {
46 unsafe {
47 let r = libc::munmap(self.ptr, self.len);
48 debug_assert_eq!(r, 0);
49 }
50 }
51}