| /** |
| * Contains the internal GC interface. |
| * |
| * Copyright: Copyright Digital Mars 2016. |
| * License: $(WEB 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 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) |
| } |
| |
| interface GC |
| { |
| |
| /* |
| * |
| */ |
| void Dtor(); |
| |
| /** |
| * |
| */ |
| void enable(); |
| |
| /** |
| * |
| */ |
| void disable(); |
| |
| /** |
| * |
| */ |
| void collect() nothrow; |
| |
| /** |
| * |
| */ |
| void collectNoStack() 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 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; |
| |
| /** |
| * Determine the base address of the block containing p. If p is not a gc |
| * allocated pointer, return null. |
| */ |
| void* addrOf(void* p) nothrow; |
| |
| /** |
| * 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; |
| |
| /** |
| * 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() nothrow; |
| |
| /** |
| * 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(in void[] segment) nothrow; |
| |
| /* |
| * |
| */ |
| bool inFinalizer() nothrow; |
| } |