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]
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)
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)
def free(self, v): sz = self.allocations[v] del self.allocations[v] c.memset(v, 0xff, sz) self.free_list += [(v, sz)]