citrun

watch C/C++ source code execute
Log | Files | Refs | LICENSE

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