Пример #1
0
 def malloc_fixedsize_clear(self, typeid16, size, can_collect,
                            has_finalizer=False, contains_weakptr=False):
     if can_collect:
         self.maybe_collect()
     size_gc_header = self.gcheaderbuilder.size_gc_header
     try:
         tot_size = size_gc_header + size
         usage = raw_malloc_usage(tot_size)
         bytes_malloced = ovfcheck(self.bytes_malloced+usage)
         ovfcheck(self.heap_usage + bytes_malloced)
     except OverflowError:
         raise memoryError
     result = raw_malloc(tot_size)
     if not result:
         raise memoryError
     raw_memclear(result, tot_size)
     hdr = llmemory.cast_adr_to_ptr(result, self.HDRPTR)
     hdr.typeid16 = typeid16
     hdr.mark = False
     hdr.flags = '\x00'
     if has_finalizer:
         hdr.next = self.malloced_objects_with_finalizer
         self.malloced_objects_with_finalizer = hdr
     elif contains_weakptr:
         hdr.next = self.objects_with_weak_pointers
         self.objects_with_weak_pointers = hdr
     else:
         hdr.next = self.malloced_objects
         self.malloced_objects = hdr
     self.bytes_malloced = bytes_malloced
     result += size_gc_header
     #llop.debug_print(lltype.Void, 'malloc typeid', typeid16,
     #                 '->', llmemory.cast_adr_to_int(result))
     self.write_malloc_statistics(typeid16, tot_size, result, False)
     return llmemory.cast_adr_to_ptr(result, llmemory.GCREF)
Пример #2
0
 def _ll_malloc_varsize_no_length_zero(length, size, itemsize):
     tot_size = _ll_compute_size(length, size, itemsize)
     result = mh.allocate(tot_size)
     if not result:
         raise MemoryError()
     llmemory.raw_memclear(result, tot_size)
     return result
Пример #3
0
 def malloc_varsize_clear(self, typeid16, length, size, itemsize,
                          offset_to_length, can_collect):
     if can_collect:
         self.maybe_collect()
     size_gc_header = self.gcheaderbuilder.size_gc_header
     try:
         fixsize = size_gc_header + size
         varsize = ovfcheck(itemsize * length)
         tot_size = ovfcheck(fixsize + varsize)
         usage = raw_malloc_usage(tot_size)
         bytes_malloced = ovfcheck(self.bytes_malloced+usage)
         ovfcheck(self.heap_usage + bytes_malloced)
     except OverflowError:
         raise memoryError
     result = raw_malloc(tot_size)
     if not result:
         raise memoryError
     raw_memclear(result, tot_size)        
     (result + size_gc_header + offset_to_length).signed[0] = length
     hdr = llmemory.cast_adr_to_ptr(result, self.HDRPTR)
     hdr.typeid16 = typeid16
     hdr.mark = False
     hdr.flags = '\x00'
     hdr.next = self.malloced_objects
     self.malloced_objects = hdr
     self.bytes_malloced = bytes_malloced
         
     result += size_gc_header
     #llop.debug_print(lltype.Void, 'malloc_varsize length', length,
     #                 'typeid', typeid16,
     #                 '->', llmemory.cast_adr_to_int(result))
     self.write_malloc_statistics(typeid16, tot_size, result, True)
     return llmemory.cast_adr_to_ptr(result, llmemory.GCREF)
Пример #4
0
 def malloc_fixedsize_clear(self, typeid16, size,
                            has_finalizer=False, contains_weakptr=False):
     size_gc_header = self.gcheaderbuilder.size_gc_header
     totalsize = size_gc_header + size
     result = self._get_memory(totalsize)
     llmemory.raw_memclear(result, totalsize)
     return self._setup_object(result, typeid16, has_finalizer)
Пример #5
0
    def malloc_varsize_clear(self, typeid16, length, size, itemsize,
                             offset_to_length):
        self.maybe_collect()
        size_gc_header = self.gcheaderbuilder.size_gc_header
        try:
            fixsize = size_gc_header + size
            varsize = ovfcheck(itemsize * length)
            tot_size = ovfcheck(fixsize + varsize)
            usage = raw_malloc_usage(tot_size)
            bytes_malloced = ovfcheck(self.bytes_malloced + usage)
            ovfcheck(self.heap_usage + bytes_malloced)
        except OverflowError:
            raise memoryError
        result = raw_malloc(tot_size)
        if not result:
            raise memoryError
        raw_memclear(result, tot_size)
        (result + size_gc_header + offset_to_length).signed[0] = length
        hdr = llmemory.cast_adr_to_ptr(result, self.HDRPTR)
        hdr.typeid16 = typeid16
        hdr.mark = False
        hdr.flags = '\x00'
        hdr.next = self.malloced_objects
        self.malloced_objects = hdr
        self.bytes_malloced = bytes_malloced

        result += size_gc_header
        #llop.debug_print(lltype.Void, 'malloc_varsize length', length,
        #                 'typeid', typeid16,
        #                 '->', llmemory.cast_adr_to_int(result))
        self.write_malloc_statistics(typeid16, tot_size, result, True)
        return llmemory.cast_adr_to_ptr(result, llmemory.GCREF)
Пример #6
0
 def malloc_fixedsize_clear(self, typeid, size, can_collect,
                            has_finalizer=False, contains_weakptr=False):
     if can_collect:
         self.maybe_collect()
     size_gc_header = self.gcheaderbuilder.size_gc_header
     try:
         tot_size = size_gc_header + size
         usage = raw_malloc_usage(tot_size)
         bytes_malloced = ovfcheck(self.bytes_malloced+usage)
         ovfcheck(self.heap_usage + bytes_malloced)
     except OverflowError:
         raise memoryError
     result = raw_malloc(tot_size)
     if not result:
         raise memoryError
     raw_memclear(result, tot_size)
     hdr = llmemory.cast_adr_to_ptr(result, self.HDRPTR)
     hdr.typeid = typeid << 1
     if has_finalizer:
         hdr.next = self.malloced_objects_with_finalizer
         self.malloced_objects_with_finalizer = hdr
     elif contains_weakptr:
         hdr.next = self.objects_with_weak_pointers
         self.objects_with_weak_pointers = hdr
     else:
         hdr.next = self.malloced_objects
         self.malloced_objects = hdr
     self.bytes_malloced = bytes_malloced
     result += size_gc_header
     #llop.debug_print(lltype.Void, 'malloc typeid', typeid,
     #                 '->', llmemory.cast_adr_to_int(result))
     self.write_malloc_statistics(typeid, tot_size, result, False)
     return llmemory.cast_adr_to_ptr(result, llmemory.GCREF)
Пример #7
0
 def malloc_fixedsize_clear(self, typeid16, size, can_collect,
                            has_finalizer=False, contains_weakptr=False):
     size_gc_header = self.gcheaderbuilder.size_gc_header
     totalsize = size_gc_header + size
     result = self._get_memory(totalsize)
     llmemory.raw_memclear(result, totalsize)
     return self._setup_object(result, typeid16, has_finalizer)
Пример #8
0
 def malloc_varsize_clear(self, typeid16, length, size, itemsize, offset_to_length):
     size_gc_header = self.gcheaderbuilder.size_gc_header
     nonvarsize = size_gc_header + size
     totalsize = self._get_totalsize_var(nonvarsize, itemsize, length)
     result = self._get_memory(totalsize)
     llmemory.raw_memclear(result, totalsize)
     (result + size_gc_header + offset_to_length).signed[0] = length
     return self._setup_object(result, typeid16, False)
Пример #9
0
 def malloc_varsize_clear(self, typeid16, length, size, itemsize,
                          offset_to_length):
     size_gc_header = self.gcheaderbuilder.size_gc_header
     nonvarsize = size_gc_header + size
     totalsize = self._get_totalsize_var(nonvarsize, itemsize, length)
     result = self._get_memory(totalsize)
     llmemory.raw_memclear(result, totalsize)
     (result + size_gc_header + offset_to_length).signed[0] = length
     return self._setup_object(result, typeid16, False)
Пример #10
0
 def ll_malloc_varsize_no_length(length, size, itemsize):
     try:
         fixsize = gc_header_offset + size
         varsize = ovfcheck(itemsize * length)
         tot_size = ovfcheck(fixsize + varsize)
     except OverflowError:
         raise MemoryError()
     result = mh._ll_malloc_fixedsize(tot_size)
     llmemory.raw_memclear(result, tot_size)
     result += gc_header_offset
     return result
Пример #11
0
 def ll_malloc_varsize_no_length(length, size, itemsize):
     try:
         fixsize = gc_header_offset + size
         varsize = ovfcheck(itemsize * length)
         tot_size = ovfcheck(fixsize + varsize)
     except OverflowError:
         raise MemoryError()
     result = mh._ll_malloc_fixedsize(tot_size)
     llmemory.raw_memclear(result, tot_size)
     result += gc_header_offset
     return result
Пример #12
0
 def malloc_varsize_marknsweep(self, totalsize):
     # In order to free the large objects from time to time, we
     # arbitrarily force a full collect() if none occurs when we have
     # allocated self.space_size + rawmalloced bytes of large objects.
     self._check_rawsize_alloced(raw_malloc_usage(totalsize))
     result = self.allocate_external_object(totalsize)
     if not result:
         raise MemoryError()
     # The parent classes guarantee zero-filled allocations, so we
     # need to follow suit.
     llmemory.raw_memclear(result, totalsize)
     size_gc_header = self.gcheaderbuilder.size_gc_header
     self.gen2_rawmalloced_objects.append(result + size_gc_header)
     return result
Пример #13
0
 def malloc_varsize_marknsweep(self, totalsize):
     # In order to free the large objects from time to time, we
     # arbitrarily force a full collect() if none occurs when we have
     # allocated self.space_size + rawmalloced bytes of large objects.
     self._check_rawsize_alloced(raw_malloc_usage(totalsize))
     result = self.allocate_external_object(totalsize)
     if not result:
         raise MemoryError()
     # The parent classes guarantee zero-filled allocations, so we
     # need to follow suit.
     llmemory.raw_memclear(result, totalsize)
     size_gc_header = self.gcheaderbuilder.size_gc_header
     self.gen2_rawmalloced_objects.append(result + size_gc_header)
     return result
Пример #14
0
 def clear_large_memory_chunk(baseaddr, size):
     pagesize = linuxpagesize.pagesize
     if pagesize == 0:
         pagesize = rffi.cast(lltype.Signed, linux_getpagesize())
         linuxpagesize.pagesize = pagesize
     if size > 2 * pagesize:
         lowbits = rffi.cast(lltype.Signed, baseaddr) & (pagesize - 1)
         if lowbits:  # clear the initial misaligned part, if any
             partpage = pagesize - lowbits
             llmemory.raw_memclear(baseaddr, partpage)
             baseaddr += partpage
             size -= partpage
         length = size & -pagesize
         madv_length = rffi.cast(rffi.SIZE_T, length)
         madv_flags = rffi.cast(rffi.INT, MADV_DONTNEED)
         err = linux_madvise(baseaddr, madv_length, madv_flags)
         if rffi.cast(lltype.Signed, err) == 0:
             baseaddr += length  # madvise() worked
             size -= length
     if size > 0:  # clear the final misaligned part, if any
         llmemory.raw_memclear(baseaddr, size)
Пример #15
0
 def malloc_varsize_marknsweep(self, totalsize, resizable=False):
     # In order to free the large objects from time to time, we
     # arbitrarily force a full collect() if none occurs when we have
     # allocated 'self.space_size' bytes of large objects.
     # XXX we should probably track the total raw_malloc'ed size
     # XXX and adjust sizes based on it; otherwise we risk doing
     # XXX many many collections if the program allocates a lot
     # XXX more than the current self.space_size.
     self._check_rawsize_alloced(raw_malloc_usage(totalsize))
     result = self.allocate_external_object(totalsize)
     if not result:
         raise MemoryError()
     # The parent classes guarantee zero-filled allocations, so we
     # need to follow suit.
     llmemory.raw_memclear(result, totalsize)
     size_gc_header = self.gcheaderbuilder.size_gc_header
     if resizable:
         self.gen2_resizable_objects.append(result + size_gc_header)
     else:
         self.gen2_rawmalloced_objects.append(result + size_gc_header)
     return result
Пример #16
0
 def malloc_varsize_marknsweep(self, totalsize, resizable=False):
     # In order to free the large objects from time to time, we
     # arbitrarily force a full collect() if none occurs when we have
     # allocated 'self.space_size' bytes of large objects.
     # XXX we should probably track the total raw_malloc'ed size
     # XXX and adjust sizes based on it; otherwise we risk doing
     # XXX many many collections if the program allocates a lot
     # XXX more than the current self.space_size.
     self._check_rawsize_alloced(raw_malloc_usage(totalsize))
     result = self.allocate_external_object(totalsize)
     if not result:
         raise MemoryError()
     # The parent classes guarantee zero-filled allocations, so we
     # need to follow suit.
     llmemory.raw_memclear(result, totalsize)
     size_gc_header = self.gcheaderbuilder.size_gc_header
     if resizable:
         self.gen2_resizable_objects.append(result + size_gc_header)
     else:
         self.gen2_rawmalloced_objects.append(result + size_gc_header)
     return result
Пример #17
0
 def clear_large_memory_chunk(baseaddr, size):
     pagesize = linuxpagesize.pagesize
     if pagesize == 0:
         pagesize = rffi.cast(lltype.Signed, linux_getpagesize())
         linuxpagesize.pagesize = pagesize
     if size > 2 * pagesize:
         lowbits = rffi.cast(lltype.Signed, baseaddr) & (pagesize - 1)
         if lowbits:     # clear the initial misaligned part, if any
             partpage = pagesize - lowbits
             llmemory.raw_memclear(baseaddr, partpage)
             baseaddr += partpage
             size -= partpage
         length = size & -pagesize
         madv_length = rffi.cast(rffi.SIZE_T, length)
         madv_flags = rffi.cast(rffi.INT, MADV_DONTNEED)
         err = linux_madvise(baseaddr, madv_length, madv_flags)
         if rffi.cast(lltype.Signed, err) == 0:
             baseaddr += length     # madvise() worked
             size -= length
     if size > 0:    # clear the final misaligned part, if any
         llmemory.raw_memclear(baseaddr, size)
Пример #18
0
    def clear_large_memory_chunk(baseaddr, size):
        # on some Unixy platforms, reading from /dev/zero is the fastest way
        # to clear arenas, because the kernel knows that it doesn't
        # need to even allocate the pages before they are used.

        # NB.: careful, don't do anything that could malloc here!
        # this code is called during GC initialization.
        fd = raw_os_open(_dev_zero, rffi.cast(rffi.INT, os.O_RDONLY),
                         rffi.cast(rffi.MODE_T, 0644))
        if rffi.cast(lltype.Signed, fd) != -1:
            while size > 0:
                size1 = rffi.cast(rffi.SIZE_T, min(READ_MAX, size))
                count = raw_os_read(fd, baseaddr, size1)
                count = rffi.cast(lltype.Signed, count)
                if count <= 0:
                    break
                size -= count
                baseaddr += count
            raw_os_close(fd)

        if size > 0:  # reading from /dev/zero failed, fallback
            llmemory.raw_memclear(baseaddr, size)
Пример #19
0
    def clear_large_memory_chunk(baseaddr, size):
        # on some Unixy platforms, reading from /dev/zero is the fastest way
        # to clear arenas, because the kernel knows that it doesn't
        # need to even allocate the pages before they are used.

        # NB.: careful, don't do anything that could malloc here!
        # this code is called during GC initialization.
        fd = raw_os_open(_dev_zero,
                         rffi.cast(rffi.INT, os.O_RDONLY),
                         rffi.cast(rffi.MODE_T, 0644))
        if rffi.cast(lltype.Signed, fd) != -1:
            while size > 0:
                size1 = rffi.cast(rffi.SIZE_T, min(READ_MAX, size))
                count = raw_os_read(fd, baseaddr, size1)
                count = rffi.cast(lltype.Signed, count)
                if count <= 0:
                    break
                size -= count
                baseaddr += count
            raw_os_close(fd)

        if size > 0:     # reading from /dev/zero failed, fallback
            llmemory.raw_memclear(baseaddr, size)
Пример #20
0
 def op_raw_memclear(self, addr, size):
     checkadr(addr)
     llmemory.raw_memclear(addr, size)
Пример #21
0
 def ll_malloc_fixedsize(size):
     size = gc_header_offset + size
     result = mh._ll_malloc_fixedsize(size)
     llmemory.raw_memclear(result, size)
     result += gc_header_offset
     return result
Пример #22
0
def llimpl_arena_reset(arena_addr, size, zero):
    if zero:
        if zero == 1:
            clear_large_memory_chunk(arena_addr, size)
        else:
            llmemory.raw_memclear(arena_addr, size)
Пример #23
0
 def setup_root_walker(self):
     stackbase = llmemory.raw_malloc(self.rootstacksize)
     ll_assert(bool(stackbase), "could not allocate root stack")
     llmemory.raw_memclear(stackbase, self.rootstacksize)
     self.gcdata.root_stack_top = stackbase
     self.gcdata.root_stack_base = stackbase
Пример #24
0
 def ll_malloc_fixedsize(size):
     size = gc_header_offset + size
     result = mh._ll_malloc_fixedsize(size)
     llmemory.raw_memclear(result, size)
     result += gc_header_offset
     return result
Пример #25
0
 def setup_root_walker(self):
     stackbase = llmemory.raw_malloc(self.rootstacksize)
     ll_assert(bool(stackbase), "could not allocate root stack")
     llmemory.raw_memclear(stackbase, self.rootstacksize)
     self.gcdata.root_stack_top  = stackbase
     self.gcdata.root_stack_base = stackbase
Пример #26
0
 def allocate_stack(self):
     result = llmemory.raw_malloc(self.rootstacksize)
     if result:
         llmemory.raw_memclear(result, self.rootstacksize)
     return result
Пример #27
0
 def allocate_stack(self):
     result = llmemory.raw_malloc(self.rootstacksize)
     if result:
         llmemory.raw_memclear(result, self.rootstacksize)
     return result
Пример #28
0
def raw_memclear(addr, size):
    from pypy.rpython.lltypesystem.llmemory import fakeaddress, raw_memclear
    if isinstance(addr, fakeaddress):
        raw_memclear(addr, size)
    else:
        simulator.memclear(addr.intaddress, size)
Пример #29
0
def llimpl_arena_reset(arena_addr, size, zero):
    if zero:
        if zero == 1:
            clear_large_memory_chunk(arena_addr, size)
        else:
            llmemory.raw_memclear(arena_addr, size)
Пример #30
0
 def op_raw_memclear(self, addr, size):
     checkadr(addr)
     llmemory.raw_memclear(addr, size)