8
8
module vrt.gc.manager.gigaman ;
9
9
10
10
import core.object ;
11
+ import core.compiler.llvm ;
11
12
12
13
import vrt.gc.mman;
13
14
import vrt.gc.slab;
@@ -74,6 +75,9 @@ public:
74
75
if (ln.next ! is null ) {
75
76
ln.next.prev = ln.prev;
76
77
}
78
+
79
+ ln.prev = null ;
80
+ ln.next = null ;
77
81
}
78
82
79
83
fn treeInsert (n: UnionNode* , compare: RBTree.CompDg)
@@ -143,8 +147,7 @@ public:
143
147
mSlabStruct = null ;
144
148
}
145
149
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 );
148
151
markPages(associatedPtr, cast (void * )s, associatedSz);
149
152
return s;
150
153
}
@@ -163,8 +166,7 @@ public:
163
166
return null ;
164
167
}
165
168
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 );
168
170
slab.setup(order:order, memory:memory, finalizer: false , pointer:false , internal:true );
169
171
170
172
// Insert it into the internal list
@@ -173,6 +175,7 @@ public:
173
175
// Mark the first slot as used, this slab resides
174
176
// there, because it manages itself.
175
177
i := slab.allocate();
178
+ gcAssert(i == 0 );
176
179
177
180
// So we can free from this slab.
178
181
markPages(memory, cast (void * )slab, sizeOfOSAlloc);
@@ -191,6 +194,9 @@ public:
191
194
local fn allocGC(sz: size_t ) void *
192
195
{
193
196
memory := pages_reserve(null , PageTable.TotalSize);
197
+ if (memory is null ) {
198
+ panicFailedToAlloc(sz);
199
+ }
194
200
195
201
retval := pages_commit(memory, sz);
196
202
if (! retval) {
@@ -260,33 +266,43 @@ public:
260
266
freeMemoryToOS(holder.extent.ptr, holder.extent.size);
261
267
}
262
268
269
+
263
270
/*
264
271
*
265
272
* OS memory allocation functions.
266
273
*
267
274
*/
268
- /**
275
+
276
+ /* !
269
277
* Allocates a chunk of memory from the OS.
270
278
*/
271
279
fn allocMemoryFromOS (n: size_t ) void *
272
280
{
281
+ gcAssert(n % PageTable.PageSize == 0 );
282
+
273
283
if (! mPageTable.canAlloc(n)) {
274
284
return null ;
275
285
}
276
286
mTotalSize += n;
277
287
pageIndex := mPageTable.allocIndex(n);
278
288
gcAssert(PageTable.pageIndexToRelative(pageIndex) != 0 );
279
289
base := cast (void * )(cast (size_t )&this + PageTable.pageIndexToRelative(pageIndex));
290
+
280
291
retval := pages_commit(base, n);
281
292
if (! retval) {
282
293
panicFailedToAlloc(n);
283
294
}
295
+
284
296
gcAssert(cast (size_t )base >= (cast (size_t )&this + mTotalArenaSize));
285
297
return base;
286
298
}
287
299
288
300
fn freeMemoryToOS (ptr: void * , n: size_t )
289
301
{
302
+ m := cast (size_t )ptr;
303
+ gcAssert(m % PageTable.PageSize == 0 );
304
+ gcAssert(n % PageTable.PageSize == 0 );
305
+
290
306
rel := mPageTable.globalToRelative(ptr);
291
307
pageIndex := PageTable.relativeToPageIndex(rel);
292
308
mPageTable.free(pageIndex, n);
@@ -438,10 +454,14 @@ private:
438
454
*/
439
455
fn markPages (memory: void * , slab: void * , n: size_t )
440
456
{
441
- gcAssert(n % PageTable.PageSize == 0 ) ;
457
+ m := cast ( size_t )memory ;
442
458
pages := n / PageTable.PageSize;
459
+
460
+ gcAssert(m % PageTable.PageSize == 0 );
461
+ gcAssert(n % PageTable.PageSize == 0 );
462
+
443
463
foreach (i; 0u .. pages) {
444
- ptr := cast (void * )(cast ( size_t )memory + (PageTable.PageSize * i));
464
+ ptr := cast (void * )(m + (PageTable.PageSize * i));
445
465
gcAssert(mPageTable.inBounds(ptr));
446
466
offset := cast (PageTable.PageEntryType)mPageTable.globalToRelative(slab);
447
467
mPageTable.setPageEntry(ptr, offset);
@@ -450,10 +470,14 @@ private:
450
470
451
471
fn unmarkPages (memory: void * , n: size_t )
452
472
{
453
- gcAssert(n % PageTable.PageSize == 0 ) ;
473
+ m := cast ( size_t )memory ;
454
474
pages := n / PageTable.PageSize;
475
+
476
+ gcAssert(m % PageTable.PageSize == 0 );
477
+ gcAssert(n % PageTable.PageSize == 0 );
478
+
455
479
foreach (i; 0u .. pages) {
456
- ptr := cast (void * )(cast ( size_t )memory + (PageTable.PageSize * i));
480
+ ptr := cast (void * )(m + (PageTable.PageSize * i));
457
481
gcAssert(mPageTable.inBounds(ptr));
458
482
mPageTable.setPageEntry(ptr, 0 );
459
483
}
0 commit comments