dragon.heapmanager – Heap allocations through the Heap Manager library

This page documents the Cython interface for the Dragon Heap Manager library. For a description of the Heap Manager and its functionality please refer to [link to heap manager doc goes here]. Example usage of this API can be found at the bottom of this document.

All functions and variables listed as C language are implemented with the cdef keyword and are not directly accessible from python-space.

Objects

BitSet

class BitSet

BitSet object. For internal testing use of the bitset library used by the heapmanager library.

dragonBitSet_t _set

BitSet struct handle

void *_mem_ptr

Pointer to the heap this bitset is part of

_attach

Whether this bitset was initialzed to a new heap or attached to an existing one

classmethod init(num_bits, space)

Initializes a new BitSet object handle to the provided memory space

Parameters:
  • num_bits (size_t) – Number of bits the handle should track

  • space – A bytearray or memoryview object the bitset should attach to

Returns:

BitSet object

Return type:

BitSet

Raises:

RuntimeError

classmethod attach(space)

Attaches a new BitSet object handle to an existing memory space with an initialized BitSet

Parameters:

space – A bytearray or memoryview object that already has an initialized BitSet

Returns:

BitSet object

Return type:

BitSet

Raises:

RuntimeError

classmethod size(num_bits)

Get the needed size for the BitSet based on the number of bits to track

Parameters:

num_bits (size_t) – Number of bits to be tracked by the BitSet handle

Returns:

Required memory size for metadata and bits to track

Return type:

size_t

detach()

Detach the BitSet from its heap. Call after using attach.

Raises:

RuntimeError if not attached

destroy()

Destroy the BitSet from its heap. Call after using init.

Raises:

RuntimeError if not initialized

get_num_bits()
Returns:

The number of bits in the set

Return type:

size_t

get_bit(idx)
Returns:

The state of the bit at the specified index

Return type:

unsigned char

Raises:

RuntimeError if out of index range

set_bit(idx)

Set the specified bit index to 1 unconditionally.

Parameters:

idx (int) – Index to set to 1

Raises:

Runtime error if out of index range

reset_bit(idx)

Set the specified bit index to 0 unconditionally.

Parameters:

idx (int) – Index to set to 0

Raises:

Runtime error if out of index range

right_zeroes(idx)
Parameters:

idx (int) – Index to check right of

Returns:

The number of 0 bits to the right of the specified index

Return type:

int

Raises:

Runtime error

dump(title, indent)
Parameters:
  • title (str) – Title to place in header of dump string

  • indent (str) – TODO: Descriptor

Raises:

RuntimeError

dump_to_str(title, indent)

Same behavior as dump but returns to string instead of stdout

Parameters:
  • title (str) – Title to place in header of dump string

  • indent (str) – TODO: Descriptor

Returns:

Dump

Return type:

str

Raises:

RuntimeError

Heap

class Heap

Heap object. Used to manage allocated memory. Can be explicitly detached from a heap or destroyed, otherwise GC should call the correct function when the objects lifetime ends.

num_segments
segment_size
num_freelists
recovery_needed
init_handle
exclusive_access

Return a pointer to the exlusive access mutex

classmethod size(max_sz_pwr, min_sz_pwr, alignment)

Calculate the necessary memory size for the given powers of two and segment alignment.

Parameters:
  • max_sz_pwr (size_t) – Power of 2 to allocate for the heap

  • min_sz_pwr (size_t) – Power of 2 for minimum segment size

  • alignment (size_t) – Memory alignment size (Multiples of 8)

Returns:

Size of heap to be allocated

Return type:

size_t

Raises:

RuntimeError

classmethod init(max_sz_pwr, min_sz_pwr, alignment, mem_addr)

Not to be confused with the default constructor. Takes the same parameters as the size class method as well as a pointer to an allocated heap.

Parameters:
  • max_sz_pwr (size_t) – Power of 2 to allocate for the heap

  • min_sz_pwr (size_t) – Power of 2 for minimum segment size

  • alignment (size_t) – Memory alignment size (Multiples of 8)

  • mem_addr (bytearray) – Bytearray or memoryview object to initialize heap with

Returns:

New heap manager

Return type:

Heap

Raises:

RuntimeError

classmethod attach(mem_addr)

Creates and attaches a new handle to an existing heap.

Parameters:

mem_addr (bytearray) – Bytearray or memoryview object to attach heap to

Returns:

New heap manager handle

Return type:

Heap

Raises:

RuntimeError

detach()

Detaches the handle from its heap.

Raises:

RuntimeError

destroy()

Destroys the handle. To be used when the object was created using init.

Raises:

RuntimeError

malloc(size)

Allocates the requested size of memory in the heap manager. Returns a new DragonMem object to hold the pointer.

Parameters:

size (size_t) – Size of memory to request from the heap manager

Returns:

New memory object

Return type:

MemoryView

Raises:

RuntimeError

free(mem_obj)

Free the memory held by the memoryview object that was allocated using the malloc method.

Parameters:

mem_obj (memoryview) – Memory object

Returns:

None

Raises:

RuntimeError if recovery is needed first

recover()

Perform heap recovery when corrupted.

Returns:

None

Raises:

RuntimeError if recovery needed flag is not set

get_stats()

Get an object that contains statistics about the heap.

Returns:

Statistics object

Return type:

MemStat

Raises:

RuntimeError

dump(title)

Print out a dump of heap information to stdout

Parameters:

title (str) – Title to include at the top of the output

Returns:

None

Raises:

RuntimeError

dump_to_str(title)

Return a dump of heap information to a string

Parameters:

title (str) – Title to include at the top of the output

Returns:

Heap info

Return type:

String

Raises:

RuntimeError

dump_to_file(title, fobj)

Not implemented

Parameters:
  • title (str) – Title to include at the top of the output

  • fobj – Python file object

Raises:

RuntimeError

Example usage

from dragon.malloc.heapmanager import Heap

# Get a 4GB Heap with 4k minimum segment sizes
heap_size = Heap.size(32, 12, 4096)
# Allocate a memory object
memobj = bytearray(heap_size)
# Initialize the handle
heap_handle = Heap.init(32, 12, 4096, bytearray)
# Attach another handle
heap_handle_2 = HeapHandle.attach(bytearray)

# Get some memory from the heap
tmp_mem = heap_handle.malloc(32)
# Do some stuff with the memory...
tmp[0:10] = b'Hello world'

# Free the memory
# When recovery is needed, runtime exception will be thrown
try:
    heap_handle.free(tmp_mem)
except:
    heap_handle.recover()
        heap_handle.free(tmp_mem)

# Detach the other handle
heap_handle_2.detach()

# Dump heap info
heap_handle.dump("Heap info")

# Destroy the handle
heap_handle.destroy()