1*627f7eb2Smrg /** 2*627f7eb2Smrg * Contains the internal GC interface. 3*627f7eb2Smrg * 4*627f7eb2Smrg * Copyright: Copyright Digital Mars 2016. 5*627f7eb2Smrg * License: $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0). 6*627f7eb2Smrg * Authors: Walter Bright, Sean Kelly, Jeremy DeHaan 7*627f7eb2Smrg */ 8*627f7eb2Smrg 9*627f7eb2Smrg /* Copyright Digital Mars 2016. 10*627f7eb2Smrg * Distributed under the Boost Software License, Version 1.0. 11*627f7eb2Smrg * (See accompanying file LICENSE or copy at 12*627f7eb2Smrg * http://www.boost.org/LICENSE_1_0.txt) 13*627f7eb2Smrg */ 14*627f7eb2Smrg module gc.gcinterface; 15*627f7eb2Smrg 16*627f7eb2Smrg static import core.memory; 17*627f7eb2Smrg alias BlkAttr = core.memory.GC.BlkAttr; 18*627f7eb2Smrg alias BlkInfo = core.memory.GC.BlkInfo; 19*627f7eb2Smrg 20*627f7eb2Smrg alias RootIterator = int delegate(scope int delegate(ref Root) nothrow dg); 21*627f7eb2Smrg alias RangeIterator = int delegate(scope int delegate(ref Range) nothrow dg); 22*627f7eb2Smrg 23*627f7eb2Smrg 24*627f7eb2Smrg struct Root 25*627f7eb2Smrg { 26*627f7eb2Smrg void* proot; 27*627f7eb2Smrg alias proot this; 28*627f7eb2Smrg } 29*627f7eb2Smrg 30*627f7eb2Smrg struct Range 31*627f7eb2Smrg { 32*627f7eb2Smrg void* pbot; 33*627f7eb2Smrg void* ptop; 34*627f7eb2Smrg TypeInfo ti; // should be tail const, but doesn't exist for references 35*627f7eb2Smrg alias pbot this; // only consider pbot for relative ordering (opCmp) 36*627f7eb2Smrg } 37*627f7eb2Smrg 38*627f7eb2Smrg interface GC 39*627f7eb2Smrg { 40*627f7eb2Smrg 41*627f7eb2Smrg /* 42*627f7eb2Smrg * 43*627f7eb2Smrg */ 44*627f7eb2Smrg void Dtor(); 45*627f7eb2Smrg 46*627f7eb2Smrg /** 47*627f7eb2Smrg * 48*627f7eb2Smrg */ 49*627f7eb2Smrg void enable(); 50*627f7eb2Smrg 51*627f7eb2Smrg /** 52*627f7eb2Smrg * 53*627f7eb2Smrg */ 54*627f7eb2Smrg void disable(); 55*627f7eb2Smrg 56*627f7eb2Smrg /** 57*627f7eb2Smrg * 58*627f7eb2Smrg */ 59*627f7eb2Smrg void collect() nothrow; 60*627f7eb2Smrg 61*627f7eb2Smrg /** 62*627f7eb2Smrg * 63*627f7eb2Smrg */ 64*627f7eb2Smrg void collectNoStack() nothrow; 65*627f7eb2Smrg 66*627f7eb2Smrg /** 67*627f7eb2Smrg * minimize free space usage 68*627f7eb2Smrg */ 69*627f7eb2Smrg void minimize() nothrow; 70*627f7eb2Smrg 71*627f7eb2Smrg /** 72*627f7eb2Smrg * 73*627f7eb2Smrg */ 74*627f7eb2Smrg uint getAttr(void* p) nothrow; 75*627f7eb2Smrg 76*627f7eb2Smrg /** 77*627f7eb2Smrg * 78*627f7eb2Smrg */ 79*627f7eb2Smrg uint setAttr(void* p, uint mask) nothrow; 80*627f7eb2Smrg 81*627f7eb2Smrg /** 82*627f7eb2Smrg * 83*627f7eb2Smrg */ 84*627f7eb2Smrg uint clrAttr(void* p, uint mask) nothrow; 85*627f7eb2Smrg 86*627f7eb2Smrg /** 87*627f7eb2Smrg * 88*627f7eb2Smrg */ 89*627f7eb2Smrg void* malloc(size_t size, uint bits, const TypeInfo ti) nothrow; 90*627f7eb2Smrg 91*627f7eb2Smrg /* 92*627f7eb2Smrg * 93*627f7eb2Smrg */ 94*627f7eb2Smrg BlkInfo qalloc(size_t size, uint bits, const TypeInfo ti) nothrow; 95*627f7eb2Smrg 96*627f7eb2Smrg /* 97*627f7eb2Smrg * 98*627f7eb2Smrg */ 99*627f7eb2Smrg void* calloc(size_t size, uint bits, const TypeInfo ti) nothrow; 100*627f7eb2Smrg 101*627f7eb2Smrg /* 102*627f7eb2Smrg * 103*627f7eb2Smrg */ 104*627f7eb2Smrg void* realloc(void* p, size_t size, uint bits, const TypeInfo ti) nothrow; 105*627f7eb2Smrg 106*627f7eb2Smrg /** 107*627f7eb2Smrg * Attempt to in-place enlarge the memory block pointed to by p by at least 108*627f7eb2Smrg * minsize bytes, up to a maximum of maxsize additional bytes. 109*627f7eb2Smrg * This does not attempt to move the memory block (like realloc() does). 110*627f7eb2Smrg * 111*627f7eb2Smrg * Returns: 112*627f7eb2Smrg * 0 if could not extend p, 113*627f7eb2Smrg * total size of entire memory block if successful. 114*627f7eb2Smrg */ 115*627f7eb2Smrg size_t extend(void* p, size_t minsize, size_t maxsize, const TypeInfo ti) nothrow; 116*627f7eb2Smrg 117*627f7eb2Smrg /** 118*627f7eb2Smrg * 119*627f7eb2Smrg */ 120*627f7eb2Smrg size_t reserve(size_t size) nothrow; 121*627f7eb2Smrg 122*627f7eb2Smrg /** 123*627f7eb2Smrg * 124*627f7eb2Smrg */ 125*627f7eb2Smrg void free(void* p) nothrow; 126*627f7eb2Smrg 127*627f7eb2Smrg /** 128*627f7eb2Smrg * Determine the base address of the block containing p. If p is not a gc 129*627f7eb2Smrg * allocated pointer, return null. 130*627f7eb2Smrg */ 131*627f7eb2Smrg void* addrOf(void* p) nothrow; 132*627f7eb2Smrg 133*627f7eb2Smrg /** 134*627f7eb2Smrg * Determine the allocated size of pointer p. If p is an interior pointer 135*627f7eb2Smrg * or not a gc allocated pointer, return 0. 136*627f7eb2Smrg */ 137*627f7eb2Smrg size_t sizeOf(void* p) nothrow; 138*627f7eb2Smrg 139*627f7eb2Smrg /** 140*627f7eb2Smrg * Determine the base address of the block containing p. If p is not a gc 141*627f7eb2Smrg * allocated pointer, return null. 142*627f7eb2Smrg */ 143*627f7eb2Smrg BlkInfo query(void* p) nothrow; 144*627f7eb2Smrg 145*627f7eb2Smrg /** 146*627f7eb2Smrg * Retrieve statistics about garbage collection. 147*627f7eb2Smrg * Useful for debugging and tuning. 148*627f7eb2Smrg */ 149*627f7eb2Smrg core.memory.GC.Stats stats() nothrow; 150*627f7eb2Smrg 151*627f7eb2Smrg /** 152*627f7eb2Smrg * add p to list of roots 153*627f7eb2Smrg */ 154*627f7eb2Smrg void addRoot(void* p) nothrow @nogc; 155*627f7eb2Smrg 156*627f7eb2Smrg /** 157*627f7eb2Smrg * remove p from list of roots 158*627f7eb2Smrg */ 159*627f7eb2Smrg void removeRoot(void* p) nothrow @nogc; 160*627f7eb2Smrg 161*627f7eb2Smrg /** 162*627f7eb2Smrg * 163*627f7eb2Smrg */ 164*627f7eb2Smrg @property RootIterator rootIter() @nogc; 165*627f7eb2Smrg 166*627f7eb2Smrg /** 167*627f7eb2Smrg * add range to scan for roots 168*627f7eb2Smrg */ 169*627f7eb2Smrg void addRange(void* p, size_t sz, const TypeInfo ti) nothrow @nogc; 170*627f7eb2Smrg 171*627f7eb2Smrg /** 172*627f7eb2Smrg * remove range 173*627f7eb2Smrg */ 174*627f7eb2Smrg void removeRange(void* p) nothrow @nogc; 175*627f7eb2Smrg 176*627f7eb2Smrg /** 177*627f7eb2Smrg * 178*627f7eb2Smrg */ 179*627f7eb2Smrg @property RangeIterator rangeIter() @nogc; 180*627f7eb2Smrg 181*627f7eb2Smrg /** 182*627f7eb2Smrg * run finalizers 183*627f7eb2Smrg */ 184*627f7eb2Smrg void runFinalizers(in void[] segment) nothrow; 185*627f7eb2Smrg 186*627f7eb2Smrg /* 187*627f7eb2Smrg * 188*627f7eb2Smrg */ 189*627f7eb2Smrg bool inFinalizer() nothrow; 190*627f7eb2Smrg } 191