Example #1
0
    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)
Example #2
0
    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 )
Example #3
0
    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
Example #4
0
    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