def __init__(self, fd, **opts): s_eventbus.EventBus.__init__(self) self.alloclock = threading.Lock() self.on('heap:write', self._fireHeapSync) self.on('heap:resize', self._fireHeapSync) self.syncact = s_reactor.Reactor() self.syncact.act('heap:write', self._actSyncHeapWrite) self.syncact.act('heap:resize', self._actSyncHeapResize) self.pagesize = opts.get('pagesize', defpage) pagerem = self.pagesize % mmap.ALLOCATIONGRANULARITY if pagerem: self.pagesize += (mmap.ALLOCATIONGRANULARITY - pagerem) fd.seek(0, os.SEEK_END) size = fd.tell() if size == 0: size = 32 # a few qword slots for expansion used = headsize + size heaphead = self._genHeapHead(size) + s_compat.to_bytes(used, 8) rem = len(heaphead) % self.pagesize if rem: heaphead += b'\x00' * (self.pagesize - rem) fd.write(heaphead) fd.flush() self.fd = fd self.atom = opts.get('atom') if self.atom is None: self.atom = s_atomfile.getAtomFile(fd) self.used = s_compat.to_int(self.readoff(32, 8)) self.onfini(self.atom.fini)
def __init__(self, fd, **opts): s_eventbus.EventBus.__init__(self) self.alloclock = threading.Lock() self.on('heap:write', self._fireHeapSync) self.on('heap:resize', self._fireHeapSync) self.syncact = s_reactor.Reactor() self.syncact.act('heap:write', self._actSyncHeapWrite ) self.syncact.act('heap:resize', self._actSyncHeapResize ) self.pagesize = opts.get('pagesize',defpage) pagerem = self.pagesize % mmap.ALLOCATIONGRANULARITY if pagerem: self.pagesize += ( mmap.ALLOCATIONGRANULARITY - pagerem ) fd.seek(0,os.SEEK_END) size = fd.tell() if size == 0: size = 32 # a few qword slots for expansion used = headsize + size heaphead = self._genHeapHead(size) + s_compat.to_bytes(used,8) rem = len(heaphead) % self.pagesize if rem: heaphead += b'\x00' * (self.pagesize - rem) fd.write(heaphead) fd.flush() self.fd = fd self.atom = opts.get('atom') if self.atom == None: self.atom = s_atomfile.getAtomFile(fd) self.used = s_compat.to_int( self.readoff(32,8) ) self.onfini( self.atom.fini )
def alloc(self, size): ''' Allocate a block within the Heap and return the offset. Example: off = heap.alloc(len(foo)) ''' # 16 byte aligned allocation sizes rem = size % 16 if rem: size += 16 - rem fullsize = headsize + size with self.alloclock: heapsize = self.used + fullsize if heapsize > self.atom.size: # align resizes to pagesize rem = heapsize % self.pagesize if rem: heapsize += (self.pagesize - rem) self.atom.resize(heapsize) self.fire('heap:resize', size=heapsize) dataoff = self.used + headsize self.used += fullsize self._writeoff(32, s_compat.to_bytes(self.used, 8)) self._writeoff(self.used, self._genHeapHead(size)) return dataoff
def alloc(self, size): ''' Allocate a block within the Heap and return the offset. Example: off = heap.alloc(len(foo)) ''' # 16 byte aligned allocation sizes rem = size % 16 if rem: size += 16 - rem fullsize = headsize + size with self.alloclock: heapsize = self.used + fullsize if heapsize > self.atom.size: # align resizes to pagesize rem = heapsize % self.pagesize if rem: heapsize += (self.pagesize - rem) self.atom.resize(heapsize) self.fire('heap:resize', size=heapsize) dataoff = self.used + headsize self.used += fullsize self._writeoff(32, s_compat.to_bytes(self.used,8)) self._writeoff(self.used, self._genHeapHead(size)) return dataoff