blob: c4e78bae782316154ab225163e1ebca7382907e1 [file] [log] [blame]
/**
* Contains the internal GC interface.
*
* Copyright: Copyright Digital Mars 2016.
* License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
* Authors: Walter Bright, Sean Kelly, Jeremy DeHaan
*/
/* Copyright Digital Mars 2016.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
module core.gc.gcinterface;
static import core.memory;
alias BlkAttr = core.memory.GC.BlkAttr;
alias BlkInfo = core.memory.GC.BlkInfo;
alias RootIterator = int delegate(scope int delegate(ref Root) nothrow dg);
alias RangeIterator = int delegate(scope int delegate(ref Range) nothrow dg);
struct Root
{
void* proot;
alias proot this;
}
struct Range
{
void* pbot;
void* ptop;
TypeInfo ti; // should be tail const, but doesn't exist for references
alias pbot this; // only consider pbot for relative ordering (opCmp)
bool opEquals(const scope Range rhs) nothrow const { return pbot == rhs.pbot; }
}
interface GC
{
/**
*
*/
void enable();
/**
*
*/
void disable();
/**
*
*/
void collect() nothrow;
/**
* minimize free space usage
*/
void minimize() nothrow;
/**
*
*/
uint getAttr(void* p) nothrow;
/**
*
*/
uint setAttr(void* p, uint mask) nothrow;
/**
*
*/
uint clrAttr(void* p, uint mask) nothrow;
/**
*
*/
void* malloc(size_t size, uint bits, const TypeInfo ti) nothrow;
/*
*
*/
BlkInfo qalloc(size_t size, uint bits, const scope TypeInfo ti) nothrow;
/*
*
*/
void* calloc(size_t size, uint bits, const TypeInfo ti) nothrow;
/*
*
*/
void* realloc(void* p, size_t size, uint bits, const TypeInfo ti) nothrow;
/**
* Attempt to in-place enlarge the memory block pointed to by p by at least
* minsize bytes, up to a maximum of maxsize additional bytes.
* This does not attempt to move the memory block (like realloc() does).
*
* Returns:
* 0 if could not extend p,
* total size of entire memory block if successful.
*/
size_t extend(void* p, size_t minsize, size_t maxsize, const TypeInfo ti) nothrow;
/**
*
*/
size_t reserve(size_t size) nothrow;
/**
*
*/
void free(void* p) nothrow @nogc;
/**
* Determine the base address of the block containing p. If p is not a gc
* allocated pointer, return null.
*/
void* addrOf(void* p) nothrow @nogc;
/**
* Determine the allocated size of pointer p. If p is an interior pointer
* or not a gc allocated pointer, return 0.
*/
size_t sizeOf(void* p) nothrow @nogc;
/**
* Determine the base address of the block containing p. If p is not a gc
* allocated pointer, return null.
*/
BlkInfo query(void* p) nothrow;
/**
* Retrieve statistics about garbage collection.
* Useful for debugging and tuning.
*/
core.memory.GC.Stats stats() @safe nothrow @nogc;
/**
* Retrieve profile statistics about garbage collection.
* Useful for debugging and tuning.
*/
core.memory.GC.ProfileStats profileStats() @safe nothrow @nogc;
/**
* add p to list of roots
*/
void addRoot(void* p) nothrow @nogc;
/**
* remove p from list of roots
*/
void removeRoot(void* p) nothrow @nogc;
/**
*
*/
@property RootIterator rootIter() @nogc;
/**
* add range to scan for roots
*/
void addRange(void* p, size_t sz, const TypeInfo ti) nothrow @nogc;
/**
* remove range
*/
void removeRange(void* p) nothrow @nogc;
/**
*
*/
@property RangeIterator rangeIter() @nogc;
/**
* run finalizers
*/
void runFinalizers(const scope void[] segment) nothrow;
/*
*
*/
bool inFinalizer() nothrow @nogc @safe;
/**
* Returns the number of bytes allocated for the current thread
* since program start. It is the same as
* GC.stats().allocatedInCurrentThread, but faster.
*/
ulong allocatedInCurrentThread() nothrow;
// ARRAY FUNCTIONS
/**
* Get the current used capacity of an array block.
*
* Note that this is only needed if you are about to change the array used
* size and need to deal with the memory that is about to go away. For
* appending or shrinking arrays that have no destructors, you probably
* don't need this function.
*
* Params:
* ptr = The pointer to check. This can be an interior pointer, but if it
* is beyond the end of the used space, the return value may not be
* valid.
* atomic = The value is fetched atomically (for shared arrays)
* Returns:
* Current array slice, or null if the pointer does not point to a valid
* appendable GC block.
*/
void[] getArrayUsed(void *ptr, bool atomic = false) nothrow;
/**
* Expand the array used size in place.
*
* Used for appending and expanding the length of the array slice. If the
* operation can be performed without reallocating, the function succeeds.
* Newly expanded data is not initialized. Slices that do not point at
* expandable GC blocks cannot be affected, and this function will always
* return false.
*
* Params:
* slice = the slice to attempt expanding in place.
* newUsed = the size that should be stored as used.
* atomic = if true, the array may be shared between threads, and this
* operation should be done atomically.
* Returns: true if successful.
*/
bool expandArrayUsed(void[] slice, size_t newUsed, bool atomic = false) nothrow @safe;
/**
* Expand the array capacity in place.
*
* Used for reserving space that can be used for appending. If the
* operation can be performed without reallocating, the function succeeds.
* The used size is not changed. Slices that do not point at expandable GC
* blocks cannot be affected, and this function will always return zero.
*
* Params:
* slice = the slice to attempt reserving capacity for.
* request = the requested size to expand to. Includes the existing data.
* Passing a value less than the current array size will result in no
* changes, but will return the current capacity.
* atomic = The array may be shared between threads, and this operation
* should be done atomically.
*
* Returns:
* Resulting capacity size or 0 if the operation could not be performed.
*/
size_t reserveArrayCapacity(void[] slice, size_t request, bool atomic = false) nothrow @safe;
/**
* Shrink used space of a slice in place.
*
* Unlike the other array functions, the array slice passed in is the
* target slice, and the existing used space is passed separately. This is
* to discourage code that ends up with a slice to dangling valid data.
*
* If slice.ptr[0 .. existingUsed] does not point to the end of a valid GC
* appendable slice, then the operation fails.
*
* Params:
* slice = The proposed valid slice data.
* existingUsed = The amount of data in the block (starting at slice.ptr)
* that is currently valid in the array. If this amount does not match
* the current used size, the operation fails.
* atomic = The slice may be shared between threads, and the operation
* should be atomic.
* Returns: true if successful.
*/
bool shrinkArrayUsed(void[] slice, size_t existingUsed, bool atomic = false) nothrow;
}