Skip to content

Commit 86be0d8

Browse files
committed
rt/gc: Tidy gigaman and add paranoia
1 parent 4068c8f commit 86be0d8

File tree

1 file changed

+33
-9
lines changed

1 file changed

+33
-9
lines changed

rt/src/vrt/gc/manager/gigaman.volt

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
module vrt.gc.manager.gigaman;
99

1010
import core.object;
11+
import core.compiler.llvm;
1112

1213
import vrt.gc.mman;
1314
import vrt.gc.slab;
@@ -74,6 +75,9 @@ public:
7475
if (ln.next !is null) {
7576
ln.next.prev = ln.prev;
7677
}
78+
79+
ln.prev = null;
80+
ln.next = null;
7781
}
7882

7983
fn treeInsert(n: UnionNode*, compare: RBTree.CompDg)
@@ -143,8 +147,7 @@ public:
143147
mSlabStruct = null;
144148
}
145149
s := cast(Slab*)ptr;
146-
s.extent.node.linked.prev = null;
147-
s.extent.node.linked.next = null;
150+
__llvm_memset(cast(void*)s, 0, typeid(Slab).size, 0, false);
148151
markPages(associatedPtr, cast(void*)s, associatedSz);
149152
return s;
150153
}
@@ -163,8 +166,7 @@ public:
163166
return null;
164167
}
165168
slab := cast(Slab*)memory;
166-
slab.extent.node.linked.prev = null;
167-
slab.extent.node.linked.next = null;
169+
__llvm_memset(cast(void*)slab, 0, typeid(Slab).size, 0, false);
168170
slab.setup(order:order, memory:memory, finalizer: false, pointer:false, internal:true);
169171

170172
// Insert it into the internal list
@@ -173,6 +175,7 @@ public:
173175
// Mark the first slot as used, this slab resides
174176
// there, because it manages itself.
175177
i := slab.allocate();
178+
gcAssert(i == 0);
176179

177180
// So we can free from this slab.
178181
markPages(memory, cast(void*)slab, sizeOfOSAlloc);
@@ -191,6 +194,9 @@ public:
191194
local fn allocGC(sz: size_t) void*
192195
{
193196
memory := pages_reserve(null, PageTable.TotalSize);
197+
if (memory is null) {
198+
panicFailedToAlloc(sz);
199+
}
194200

195201
retval := pages_commit(memory, sz);
196202
if (!retval) {
@@ -260,33 +266,43 @@ public:
260266
freeMemoryToOS(holder.extent.ptr, holder.extent.size);
261267
}
262268

269+
263270
/*
264271
*
265272
* OS memory allocation functions.
266273
*
267274
*/
268-
/**
275+
276+
/*!
269277
* Allocates a chunk of memory from the OS.
270278
*/
271279
fn allocMemoryFromOS(n: size_t) void*
272280
{
281+
gcAssert(n % PageTable.PageSize == 0);
282+
273283
if (!mPageTable.canAlloc(n)) {
274284
return null;
275285
}
276286
mTotalSize += n;
277287
pageIndex := mPageTable.allocIndex(n);
278288
gcAssert(PageTable.pageIndexToRelative(pageIndex) != 0);
279289
base := cast(void*)(cast(size_t)&this + PageTable.pageIndexToRelative(pageIndex));
290+
280291
retval := pages_commit(base, n);
281292
if (!retval) {
282293
panicFailedToAlloc(n);
283294
}
295+
284296
gcAssert(cast(size_t)base >= (cast(size_t)&this + mTotalArenaSize));
285297
return base;
286298
}
287299

288300
fn freeMemoryToOS(ptr: void*, n: size_t)
289301
{
302+
m := cast(size_t)ptr;
303+
gcAssert(m % PageTable.PageSize == 0);
304+
gcAssert(n % PageTable.PageSize == 0);
305+
290306
rel := mPageTable.globalToRelative(ptr);
291307
pageIndex := PageTable.relativeToPageIndex(rel);
292308
mPageTable.free(pageIndex, n);
@@ -438,10 +454,14 @@ private:
438454
*/
439455
fn markPages(memory: void*, slab: void*, n: size_t)
440456
{
441-
gcAssert(n % PageTable.PageSize == 0);
457+
m := cast(size_t)memory;
442458
pages := n / PageTable.PageSize;
459+
460+
gcAssert(m % PageTable.PageSize == 0);
461+
gcAssert(n % PageTable.PageSize == 0);
462+
443463
foreach (i; 0u .. pages) {
444-
ptr := cast(void*)(cast(size_t)memory + (PageTable.PageSize * i));
464+
ptr := cast(void*)(m + (PageTable.PageSize * i));
445465
gcAssert(mPageTable.inBounds(ptr));
446466
offset := cast(PageTable.PageEntryType)mPageTable.globalToRelative(slab);
447467
mPageTable.setPageEntry(ptr, offset);
@@ -450,10 +470,14 @@ private:
450470

451471
fn unmarkPages(memory: void*, n: size_t)
452472
{
453-
gcAssert(n % PageTable.PageSize == 0);
473+
m := cast(size_t)memory;
454474
pages := n / PageTable.PageSize;
475+
476+
gcAssert(m % PageTable.PageSize == 0);
477+
gcAssert(n % PageTable.PageSize == 0);
478+
455479
foreach (i; 0u .. pages) {
456-
ptr := cast(void*)(cast(size_t)memory + (PageTable.PageSize * i));
480+
ptr := cast(void*)(m + (PageTable.PageSize * i));
457481
gcAssert(mPageTable.inBounds(ptr));
458482
mPageTable.setPageEntry(ptr, 0);
459483
}

0 commit comments

Comments
 (0)