Beispiel #1
0
    def alloc(self, sz = None):
        if sz == None:
            sz = self.page_sz
        if sz > self.page_sz:
            raise Exception("too big")

        victim = self.get_free(sz)
        if None is victim:
            victim = self.get_page()

        if victim[1] > sz:
            self.free_list += [(victim[0] + sz, victim[1] - sz)]

        self.allocations[victim[0]] = sz

	c.memset(victim[0], 0, sz)

        return victim[0]
Beispiel #2
0
    def get_page(self):
        if self._hugetlb_available:
            assert self.page_sz == self._hugetlb_pgsz
            prot = c.PROT_READ | c.PROT_WRITE
            flags = c.MAP_ANONYMOUS | c.MAP_PRIVATE | c.MAP_LOCKED | c.MAP_HUGETLB | c.MAP_32BIT
            flags |= (21 << c.MAP_HUGE_SHIFT)
            sz = self._hugetlb_pgsz
            page = c.mmap(0, sz, prot, flags, -1, 0)
            if c.MAP_FAILED == page:
                e = c.errno.value
                raise Exception("mmap: 0x%x" % e)
        else:
            assert self.page_sz == self._page_sz
            page = c.valloc(self._page_sz)
            if 0 == page:
                    raise Exception("valloc")
            if -1 == c.mlock(page, self._page_sz):
                    raise Exception("mlock")

        c.memset(page, 0xFF, self.page_sz)

        self.locked_pages += [page]
        return (page, self.page_sz)
Beispiel #3
0
    def get_page(self):
        if self._hugetlb_available:
            assert self.page_sz == self._hugetlb_pgsz
            prot = c.PROT_READ | c.PROT_WRITE
            flags = c.MAP_ANONYMOUS | c.MAP_PRIVATE | c.MAP_LOCKED | c.MAP_HUGETLB
            flags |= (21 << c.MAP_HUGE_SHIFT)
            sz = self._hugetlb_pgsz
            page = c.mmap(0, sz, prot, flags, -1, 0)
            if c.MAP_FAILED == page:
                e = c.errno.value
                raise Exception("mmap: 0x%x" % e)
        else:
            assert self.page_sz == self._page_sz
            page = c.valloc(self._page_sz)
            if 0 == page:
                    raise Exception("valloc")
            if -1 == c.mlock(page, self._page_sz):
                    raise Exception("mlock")

        c.memset(page, 0xFF, self.page_sz)

        self.locked_pages += [page]
        return (page, self.page_sz)
Beispiel #4
0
 def free(self, v):
     sz = self.allocations[v]
     del self.allocations[v]
     c.memset(v, 0xff, sz)
     self.free_list += [(v, sz)]