예제 #1
0
 def __init__(self, filepath, size=None, chunk_size=None):
     super(FileLocker, self).__init__()
     self.addr = None
     self.size = 0
     self.filepath = filepath
     self.chunk_size = chunk_size or 1024 * 1024
     assert self.chunk_size % PAGESIZE == 0
     size = size or getsize(filepath)
     with open(filepath, "r") as f:
         self.mapper = FileMapper(filepath, f.fileno(), size)
     self.addr = self.mapper.addr
     self.size = size
     if self.size == 0:
         return
     chunks = long(ceil(size / float(self.chunk_size)))
     assert chunks != 0, "chunks == 0"
     locked = 0
     for i in xrange(chunks):
         chunk_offs = self.mapper.addr + i * self.chunk_size
         chunk_size = min(self.mapper.addr + size - chunk_offs, self.chunk_size)
         res = mlock(chunk_offs, chunk_size)
         assert res != -1, "Failed to mlock %s chunk [0x%016x-0x%016x] (errno: %d)" % (
             filepath,
             chunk_offs,
             chunk_offs + chunk_size - 1,
             get_errno(),
         )
         locked += chunk_size
     assert locked == size, "locked != size"
예제 #2
0
 def __init__(self, filepath, size=None, chunk_size=None):
     super(FileLocker, self).__init__()
     self.addr = None
     self.size = 0
     self.filepath = filepath
     self.chunk_size = chunk_size or 1024 * 1024
     assert self.chunk_size % PAGESIZE == 0
     size = size or getsize(filepath)
     with open(filepath, "r") as f:
         self.mapper = FileMapper(filepath, f.fileno(), size)
     self.addr = self.mapper.addr
     self.size = size
     if self.size == 0:
         return
     chunks = long(ceil(size / float(self.chunk_size)))
     assert chunks != 0, "chunks == 0"
     locked = 0
     for i in xrange(chunks):
         chunk_offs = self.mapper.addr + i * self.chunk_size
         chunk_size = min(self.mapper.addr + size - chunk_offs,
                          self.chunk_size)
         res = mlock(chunk_offs, chunk_size)
         assert res != -1, \
             "Failed to mlock %s chunk [0x%016x-0x%016x] (errno: %d)" % (filepath, chunk_offs, chunk_offs + chunk_size - 1, get_errno())
         locked += chunk_size
     assert locked == size, "locked != size"
예제 #3
0
 def __init__(self, filepath, fileno, size):
     super(FileMapper, self).__init__()
     self.size = size
     self.addr = mmap(0, size, PROT_READ, MAP_SHARED, fileno, 0)
     assert self.addr != MAP_FAILED, \
         "Failed to mmap %s (errno: %d)" % (filepath, get_errno())
예제 #4
0
 def __init__(self, filepath, fileno, size):
     super(FileMapper, self).__init__()
     self.size = size
     self.addr = mmap(0, size, PROT_READ, MAP_SHARED, fileno, 0)
     assert self.addr != MAP_FAILED, "Failed to mmap %s (errno: %d)" % (filepath, get_errno())