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