mem_unix.h (1716B)
1 // 2 // Copyright (c) 2016 Kyle Milz <kyle@0x30.net> 3 // 4 // Permission to use, copy, modify, and distribute this software for any 5 // purpose with or without fee is hereby granted, provided that the above 6 // copyright notice and this permission notice appear in all copies. 7 // 8 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 // 16 #include <sys/mman.h> // mmap 17 #include <sys/stat.h> // S_IRUSR, S_IWUSR 18 19 #include <err.h> 20 #include <fcntl.h> // O_RDONLY 21 #include <unistd.h> // getpagesize 22 23 #include "mem.h" // citrun::mem 24 25 26 namespace citrun { 27 28 class mem_unix : public citrun::mem 29 { 30 std::string m_path; 31 int m_fd; 32 33 // Mandatory implementation. 34 size_t 35 alloc_size() 36 { 37 return getpagesize(); 38 } 39 40 public: 41 mem_unix(std::string const &path) : 42 m_path(path), 43 m_fd(0) 44 { 45 struct stat sb; 46 47 if ((m_fd = open(m_path.c_str(), O_RDONLY, S_IRUSR | S_IWUSR)) < 0) 48 err(1, "open"); 49 50 if (fstat(m_fd, &sb) < 0) 51 err(1, "fstat"); 52 53 // Explicitly check 0 here otherwise mmap barfs. 54 if (sb.st_size == 0 || sb.st_size > 1024 * 1024 * 1024) 55 errx(1, "invalid file size %lli", sb.st_size); 56 57 m_size = sb.st_size; 58 59 m_base = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, m_fd, 0); 60 if (m_base == MAP_FAILED) 61 err(1, "mmap"); 62 } 63 }; 64 65 } // namespace citrun