Starboard Module Reference: memory.h

Defines functions for memory allocation, alignment, copying, and comparing.

Porters

All of the "Unchecked" and "Free" functions must be implemented, but they should not be called directly. The Starboard platform wraps them with extra accounting under certain circumstances.

Porters and Application Developers

Nobody should call the "Checked", "Unchecked" or "Free" functions directly because that evades Starboard's memory tracking. In both port implementations and Starboard client application code, you should always call SbMemoryAllocate and SbMemoryDeallocate rather than SbMemoryAllocateUnchecked and SbMemoryFree.

  • The "checked" functions are SbMemoryAllocateChecked(), SbMemoryReallocateChecked(), and SbMemoryAllocateAlignedChecked().

  • The "unchecked" functions are SbMemoryAllocateUnchecked(), SbMemoryReallocateUnchecked(), and SbMemoryAllocateAlignedUnchecked().

  • The "free" functions are SbMemoryFree() and SbMemoryFreeAligned().

Enums

SbMemoryMapFlags

The bitwise OR of these flags should be passed to SbMemoryMap to indicate how the mapped memory can be used.

Values

  • kSbMemoryMapProtectReserved

    No flags set: Reserves virtual address space. SbMemoryProtect() can later make it accessible.

  • kSbMemoryMapProtectRead

  • kSbMemoryMapProtectWrite

  • kSbMemoryMapProtectExec

  • kSbMemoryMapProtectReadWrite

Functions

SbMemoryAlignToPageSize

Rounds size up to SB_MEMORY_PAGE_SIZE.

Declaration

static size_t SbMemoryAlignToPageSize(size_t size)

SbMemoryAllocate

Allocates and returns a chunk of memory of at least size bytes. This function should be called from the client codebase. It is intended to be a drop-in replacement for malloc.

Note that this function returns NULL if it is unable to allocate the memory.

size: The amount of memory to be allocated. If size is 0, the function may return NULL or it may return a unique pointer value that can be passed to SbMemoryDeallocate.

Declaration

void* SbMemoryAllocate(size_t size)

SbMemoryAllocateAligned

Allocates and returns a chunk of memory of at least size bytes, aligned to alignment. This function should be called from the client codebase. It is meant to be a drop-in replacement for memalign.

The function returns NULL if it cannot allocate the memory. In addition, the function's behavior is undefined if alignment is not a power of two.

alignment: The way that data is arranged and accessed in memory. The value must be a power of two. size: The size of the memory to be allocated. If size is 0, the function may return NULL or it may return a unique aligned pointer value that can be passed to SbMemoryDeallocateAligned.

Declaration

void* SbMemoryAllocateAligned(size_t alignment, size_t size)

SbMemoryAllocateAlignedChecked

Same as SbMemoryAllocateAlignedUnchecked, but will abort() in the case of an allocation failure.

DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.

Declaration

void* SbMemoryAllocateAlignedChecked(size_t alignment, size_t size)

SbMemoryAllocateAlignedUnchecked

This is the implementation of SbMemoryAllocateAligned that must be provided by Starboard ports.

DO NOT CALL. Call SbMemoryAllocateAligned(...) instead.

Declaration

void* SbMemoryAllocateAlignedUnchecked(size_t alignment, size_t size)

SbMemoryAllocateChecked

Same as SbMemoryAllocateUnchecked, but will abort() in the case of an allocation failure.

DO NOT CALL. Call SbMemoryAllocate(...) instead.

Declaration

void* SbMemoryAllocateChecked(size_t size)

SbMemoryAllocateNoReport

Same as SbMemoryAllocate() but will not report memory to the tracker. Avoid using this unless absolutely necessary.

Declaration

void* SbMemoryAllocateNoReport(size_t size)

SbMemoryAllocateUnchecked

This is the implementation of SbMemoryAllocate that must be provided by Starboard ports.

DO NOT CALL. Call SbMemoryAllocate(...) instead.

Declaration

void* SbMemoryAllocateUnchecked(size_t size)

SbMemoryCalloc

A wrapper that implements a drop-in replacement for calloc, which is used in some packages.

Declaration

static void* SbMemoryCalloc(size_t count, size_t size)

SbMemoryCompare

Compares the contents of the first count bytes of buffer1 and buffer2. This function returns:

  • -1 if buffer1 is "less-than" buffer2

  • 0 if buffer1 and buffer2 are equal

  • 1 if buffer1 is "greater-than" buffer2.

This function is meant to be a drop-in replacement for memcmp.

buffer1: The first buffer to be compared. buffer2: The second buffer to be compared. count: The number of bytes to be compared.

Declaration

int SbMemoryCompare(const void *buffer1, const void *buffer2, size_t count)

SbMemoryCopy

Copies count sequential bytes from source to destination, without support for the source and destination regions overlapping. This function is meant to be a drop-in replacement for memcpy.

The function's behavior is undefined if destination or source are NULL, and the function is a no-op if count is 0. The return value is destination.

destination: The destination of the copied memory. source: The source of the copied memory. count: The number of sequential bytes to be copied.

Declaration

void* SbMemoryCopy(void *destination, const void *source, size_t count)

SbMemoryDeallocate

Frees a previously allocated chunk of memory. If memory is NULL, then the operation is a no-op. This function should be called from the client codebase. It is meant to be a drop-in replacement for free.

memory: The chunk of memory to be freed.

Declaration

void SbMemoryDeallocate(void *memory)

SbMemoryDeallocateAligned

memory: The chunk of memory to be freed. If memory is NULL, then the function is a no-op.

Declaration

void SbMemoryDeallocateAligned(void *memory)

SbMemoryDeallocateNoReport

Same as SbMemoryDeallocate() but will not report memory deallocation to the tracker. This function must be matched with SbMemoryAllocateNoReport().

Declaration

void SbMemoryDeallocateNoReport(void *memory)

SbMemoryFindByte

Finds the lower 8-bits of value in the first count bytes of buffer and returns either a pointer to the first found occurrence or NULL if the value is not found. This function is meant to be a drop-in replacement for memchr.

Declaration

const void* SbMemoryFindByte(const void *buffer, int value, size_t count)

SbMemoryFlush

Flushes any data in the given virtual address range that is cached locally in the current processor core to physical memory, ensuring that data and instruction caches are cleared. This is required to be called on executable memory that has been written to and might be executed in the future.

Declaration

void SbMemoryFlush(void *virtual_address, int64_t size_bytes)

SbMemoryFree

This is the implementation of SbMemoryDeallocate that must be provided by Starboard ports.

DO NOT CALL. Call SbMemoryDeallocate(...) instead.

Declaration

void SbMemoryFree(void *memory)

SbMemoryFreeAligned

This is the implementation of SbMemoryFreeAligned that must be provided by Starboard ports.

DO NOT CALL. Call SbMemoryDeallocateAligned(...) instead.

Declaration

void SbMemoryFreeAligned(void *memory)

SbMemoryGetStackBounds

Gets the stack bounds for the current thread.

out_high: The highest addressable byte + 1 for the current thread. out_low: The lowest addressable byte for the current thread.

Declaration

void SbMemoryGetStackBounds(void **out_high, void **out_low)

SbMemoryIsAligned

Checks whether memory is aligned to alignment bytes.

Declaration

static bool SbMemoryIsAligned(const void *memory, size_t alignment)

SbMemoryIsZero

Returns true if the first count bytes of buffer are set to zero.

Declaration

static bool SbMemoryIsZero(const void *buffer, size_t count)

SbMemoryMap

Allocates size_bytes worth of physical memory pages and maps them into an available virtual region. This function returns SB_MEMORY_MAP_FAILED on failure. NULL is a valid return value.

size_bytes: The amount of physical memory pages to be allocated. flags: The bitwise OR of the protection flags for the mapped memory as specified in SbMemoryMapFlags. Allocating executable memory is not allowed and will fail. If executable memory is needed, map non-executable memory first and then switch access to executable using SbMemoryProtect. When kSbMemoryMapProtectReserved is used, the address space will not be accessible and, if possible, the platform should not count it against any memory budget. name: A value that appears in the debugger on some platforms. The value can be up to 32 bytes.

Declaration

void* SbMemoryMap(int64_t size_bytes, int flags, const char *name)

SbMemoryMove

Copies count sequential bytes from source to destination, with support for the source and destination regions overlapping. This function is meant to be a drop-in replacement for memmove.

The function's behavior is undefined if destination or source are NULL, and the function is a no-op if count is 0. The return value is destination.

destination: The destination of the copied memory. source: The source of the copied memory. count: The number of sequential bytes to be copied.

Declaration

void* SbMemoryMove(void *destination, const void *source, size_t count)

SbMemoryProtect

Change the protection of size_bytes of memory regions, starting from virtual_address, to flags, returning true on success.

Declaration

bool SbMemoryProtect(void *virtual_address, int64_t size_bytes, int flags)

SbMemoryReallocate

Attempts to resize memory to be at least size bytes, without touching the contents of memory.

  • If the function cannot perform the fast resize, it allocates a new chunk of memory, copies the contents over, and frees the previous chunk, returning a pointer to the new chunk.

  • If the function cannot perform the slow resize, it returns NULL, leaving the given memory chunk unchanged.

This function should be called from the client codebase. It is meant to be a drop-in replacement for realloc.

memory: The chunk of memory to be resized. memory may be NULL, in which case it behaves exactly like SbMemoryAllocateUnchecked. size: The size to which memory will be resized. If size is 0, the function may return NULL or it may return a unique pointer value that can be passed to SbMemoryDeallocate.

Declaration

void* SbMemoryReallocate(void *memory, size_t size)

SbMemoryReallocateChecked

Same as SbMemoryReallocateUnchecked, but will abort() in the case of an allocation failure.

DO NOT CALL. Call SbMemoryReallocate(...) instead.

Declaration

void* SbMemoryReallocateChecked(void *memory, size_t size)

SbMemoryReallocateUnchecked

This is the implementation of SbMemoryReallocate that must be provided by Starboard ports.

DO NOT CALL. Call SbMemoryReallocate(...) instead.

Declaration

void* SbMemoryReallocateUnchecked(void *memory, size_t size)

SbMemorySet

Fills count sequential bytes starting at destination, with the unsigned char coercion of byte_value. This function is meant to be a drop-in replacement for memset.

The function's behavior is undefined if destination is NULL, and the function is a no-op if count is 0. The return value is destination.

destination: The destination of the copied memory. count: The number of sequential bytes to be set.

Declaration

void* SbMemorySet(void *destination, int byte_value, size_t count)

SbMemoryUnmap

Unmap size_bytes of physical pages starting from virtual_address, returning true on success. After this function completes, [virtual_address, virtual_address + size_bytes) will not be read/writable. This function can unmap multiple contiguous regions that were mapped with separate calls to SbMemoryMap(). For example, if one call to SbMemoryMap(0x1000) returns (void*)0xA000, and another call to SbMemoryMap(0x1000) returns (void*)0xB000, SbMemoryUnmap(0xA000, 0x2000) should free both regions.

Declaration

bool SbMemoryUnmap(void *virtual_address, int64_t size_bytes)