/** * 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; }