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"
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"
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())
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())