NAME ^

src/resources.c - Allocate and deallocate tracked resources

DESCRIPTION ^

Parrot Memory Management Code ^

static void *alloc_new_block(Interp *interp, size_t size, struct Memory_Pool *pool, const char *why)

Allocate a new memory block. We allocate the larger of however much was asked for or the default size, whichever's larger. The given text is used for debugging.

static void *mem_allocate(Interp *, size_t size, struct Memory_Pool *pool)

Allocates memory for headers.

Alignment problems history:

See http://archive.develooper.com/perl6-internals%40perl.org/msg12310.html for details.

- return aligned pointer *if needed* - return strings et al at unaligned i.e. void* boundaries - remember alignment in a buffer header bit use this in compaction code - reduce alignment to a reasonable value i.e. MALLOC_ALIGNMENT aka 2*sizeof (size_t) or just 8 (TODO make a config hint)

Buffer memory layout:

                    +-----------------+
                    |  ref_count   |f |    # GC header
  obj->bufstart  -> +-----------------+
                    |  data           |
                    v                 v

 * if PObj_is_COWable is set, then we have
   - a ref_count, {inc,dec}remented by 2 always
   - the lo bit 'f' means 'is being forwarded" - what TAIL_flag was

 * if PObj_align_FLAG is set, obj->bufstart is aligned like discussed above
 * obj->buflen is the usable length excluding the optional GC part.

Compaction Code ^

static void compact_pool(Interp *interp, struct Memory_Pool *pool)

Compact the buffer pool.

void Parrot_go_collect(Interp *interp)

Go do a GC run. This only scans the string pools and compacts them, it doesn't check for string liveness.

Parrot Re/Allocate Code ^

void Parrot_reallocate(Interp *interp, Buffer *from, size_t tosize)

Reallocate the Buffer's buffer memory to the given size. The allocated buffer will not shrink. If the buffer was allocated with <Parrot_allocate_aligned> the new buffer will also be aligned. As with all reallocation, the new buffer might have moved and the additional memory is not cleared.

void Parrot_reallocate_string(Interp *interp, STRING *str, size_t tosize)

Reallocate the STRING's buffer memory to the given size. The allocated buffer will not shrink. This function sets also str->strstart to the new buffer location, str->bufused is not changed.

void Parrot_allocate(Interp *interp, Buffer *buffer, size_t size)

Allocate buffer memory for the given Buffer pointer. The size has to be a multiple of the word size. PObj_buflen will be set to exactly the given size.

void Parrot_allocate_aligned(Interp *interp, Buffer *buffer, size_t size)

Like above, except the size will be rounded up and the address of the buffer will have the same alignment as a pointer returned by malloc(3) suitable to hold e.g. a FLOATVAL array.

void Parrot_allocate_string(Interp *interp, STRING *str, size_t size)

Allocate the STRING's buffer memory to the given size. The allocated buffer maybe be slightly bigger than the given size. This function sets also str->strstart to the new buffer location, str->bufused is not changed.

static struct Memory_Pool *new_memory_pool(size_t min_block, compact_f compact)

Create a new memory pool.

void Parrot_initialize_memory_pools(Interp *interp)

Initialize the managed memory pools.

void Parrot_destroy_memory_pools(Interp *interp)

Destroys the memory pools.

void Parrot_merge_memory_pools(Interp *dest_interp, Interp *source_interp)

Merge the memory pools of source_interp into dest_interp.

SEE ALSO ^

include/parrot/resources.h, src/memory.c.

HISTORY ^

Initial version by Dan on 2001.10.2.


parrot