src/gc/resources.c - Allocate and deallocate tracked resources


Parrot Memory Management Code ^

static void alloc_new_block(PARROT_INTERP, size_t size, NOTNULL(Memory_Pool *pool), NOTNULL(const char *why))

Allocate a new memory block. We allocate the larger of the requested size or the default size. The given text is used for debugging.

PARROT_MALLOC PARROT_CANNOT_RETURN_NULL static void *mem_allocate(PARROT_INTERP, size_t size, NOTNULL(Memory_Pool *pool))

Allocates memory for headers.

Alignment problems history:

See 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.

TODO: Not yet documented!!!

static void debug_print_buf(PARROT_INTERP, NOTNULL(const PObj *b))

TODO: Not yet documented!!!

Compaction Code ^

static void compact_pool(PARROT_INTERP, NOTNULL(Memory_Pool *pool))

Compact the buffer pool.

void Parrot_go_collect(PARROT_INTERP)

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

PARROT_PURE_FUNCTION PARROT_WARN_UNUSED_RESULT static size_t aligned_size(NOTNULL(const Buffer *buffer), size_t len)

TODO: Not yet documented!!!

PARROT_CANNOT_RETURN_NULL PARROT_WARN_UNUSED_RESULT static char *aligned_mem(NOTNULL(const Buffer *buffer), NOTNULL(char *mem))

TODO: Not yet documented!!!

PARROT_CONST_FUNCTION PARROT_WARN_UNUSED_RESULT static size_t aligned_string_size(size_t len)

TODO: Not yet documented!!!

PARROT_WARN_UNUSED_RESULT int Parrot_in_memory_pool(PARROT_INTERP, NOTNULL(void *bufstart))

TODO: Not yet documented!!!

Parrot Re/Allocate Code ^

void Parrot_reallocate(PARROT_INTERP, NOTNULL(Buffer *buffer), 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(PARROT_INTERP, NOTNULL(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(PARROT_INTERP, NOTNULL(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(PARROT_INTERP, NOTNULL(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(PARROT_INTERP, NOTNULL(STRING *str), size_t size)

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

PARROT_MALLOC PARROT_CANNOT_RETURN_NULL static Memory_Pool *new_memory_pool(size_t min_block, NULLOK(compact_f compact))

Create a new memory pool.

void Parrot_initialize_memory_pools(PARROT_INTERP)

Initialize the managed memory pools.

void Parrot_destroy_memory_pools(PARROT_INTERP)

Destroys the memory pools.

static void merge_pools(NOTNULL(Memory_Pool *dest), NOTNULL(Memory_Pool *source))

TODO: Not yet documented!!!

void Parrot_merge_memory_pools(NOTNULL(Interp *dest_interp), NOTNULL(Interp *source_interp))

Merge the memory pools of source_interp into dest_interp.


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


Initial version by Dan on 2001.10.2.