The OpenD Programming Language

SharedAscendingPageAllocator

SharedAscendingPageAllocator is the threadsafe version of AscendingPageAllocator.

Constructors

this
this(size_t n)

Rounds the mapping size to the next multiple of the page size and calls the OS primitive responsible for creating memory mappings: mmap on POSIX and VirtualAlloc on Windows.

Members

Functions

alignedAllocate
void[] alignedAllocate(size_t n, uint a)

Rounds the allocation size to the next multiple of the page size. The allocation only reserves a range of virtual pages but the actual physical memory is allocated on demand, when accessing the memory.

allocate
void[] allocate(size_t n)

Rounds the allocation size to the next multiple of the page size. The allocation only reserves a range of virtual pages but the actual physical memory is allocated on demand, when accessing the memory.

deallocate
void deallocate(void[] b)

Decommit all physical memory associated with the buffer given as parameter, but keep the range of virtual addresses.

deallocateAll
bool deallocateAll()

Removes the memory mapping causing all physical memory to be decommited and the virtual address space to be reclaimed.

expand
bool expand(void[] b, size_t delta)

If the passed buffer is not the last allocation, then delta can be at most the number of bytes left on the last page. Otherwise, we can expand the last allocation until the end of the virtual address range.

getAvailableSize
size_t getAvailableSize()

Returns the available size for further allocations in bytes.

goodAllocSize
size_t goodAllocSize(size_t n)

Rounds the requested size to the next multiple of the page size.

owns
Ternary owns(void[] buf)

Returns Ternary.yes if the passed buffer is inside the range of virtual adresses. Does not guarantee that the passed buffer is still valid.

Examples

import core.memory : pageSize;
import core.thread : ThreadGroup;

enum numThreads = 100;
shared SharedAscendingPageAllocator a = SharedAscendingPageAllocator(pageSize * numThreads);

void fun()
{
    void[] b = a.allocate(pageSize);
    assert(b.length == pageSize);

    assert(a.deallocate(b));
}

auto tg = new ThreadGroup;
foreach (i; 0 .. numThreads)
{
    tg.create(&fun);
}
tg.joinAll();

Meta