Home | History | Annotate | Download | only in core
      1 #include "SkMMapStream.h"
      2 
      3 #include <unistd.h>
      4 #include <sys/mman.h>
      5 #include <fcntl.h>
      6 #include <errno.h>
      7 
      8 SkMMAPStream::SkMMAPStream(const char filename[])
      9 {
     10     fFildes = -1;   // initialize to failure case
     11 
     12     int fildes = open(filename, O_RDONLY);
     13     if (fildes < 0)
     14     {
     15         SkDEBUGF(("---- failed to open(%s) for mmap stream error=%d\n", filename, errno));
     16         return;
     17     }
     18 
     19     off_t offset = lseek(fildes, 0, SEEK_END);    // find the file size
     20     if (offset == -1)
     21     {
     22         SkDEBUGF(("---- failed to lseek(%s) for mmap stream error=%d\n", filename, errno));
     23         close(fildes);
     24         return;
     25     }
     26     (void)lseek(fildes, 0, SEEK_SET);   // restore file offset to beginning
     27 
     28     // to avoid a 64bit->32bit warning, I explicitly create a size_t size
     29     size_t size = static_cast<size_t>(offset);
     30 
     31     void* addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fildes, 0);
     32     if (MAP_FAILED == addr)
     33     {
     34         SkDEBUGF(("---- failed to mmap(%s) for mmap stream error=%d\n", filename, errno));
     35         close(fildes);
     36         return;
     37     }
     38 
     39     this->INHERITED::setMemory(addr, size);
     40 
     41     fFildes = fildes;
     42     fAddr = addr;
     43     fSize = size;
     44 }
     45 
     46 SkMMAPStream::~SkMMAPStream()
     47 {
     48     this->closeMMap();
     49 }
     50 
     51 void SkMMAPStream::setMemory(const void* data, size_t length, bool copyData)
     52 {
     53     this->closeMMap();
     54     this->INHERITED::setMemory(data, length, copyData);
     55 }
     56 
     57 void SkMMAPStream::closeMMap()
     58 {
     59     if (fFildes >= 0)
     60     {
     61         munmap(fAddr, fSize);
     62         close(fFildes);
     63         fFildes = -1;
     64     }
     65 }
     66 
     67