Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit 59aaec6

Browse files
committed
fix extend, add invariant, move updating pagetable and bPageOffsets into allocPages for better encapsulation
1 parent 2b058c7 commit 59aaec6

File tree

1 file changed

+49
-13
lines changed
  • src/gc/impl/conservative

1 file changed

+49
-13
lines changed

src/gc/impl/conservative/gc.d

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,7 @@ class ConservativeGC : GC
786786
debug (MEMSTOMP) memset(pool.baseAddr + (pagenum + psz) * PAGESIZE, 0xF0, sz * PAGESIZE);
787787
memset(lpool.pagetable + pagenum + psz, B_PAGEPLUS, sz);
788788
lpool.bPageOffsets[pagenum] = cast(uint) (psz + sz);
789-
for (auto offset = psz + 1; offset < psz + sz; offset++)
789+
for (auto offset = psz; offset < psz + sz; offset++)
790790
lpool.bPageOffsets[pagenum + offset] = cast(uint) offset;
791791
if (freesz > sz)
792792
lpool.setFreePageOffsets(pagenum + psz + sz, freesz - sz);
@@ -1819,16 +1819,7 @@ struct Gcx
18191819
assert(pool);
18201820

18211821
debug(PRINTF) printFreeInfo(&pool.base);
1822-
pool.pagetable[pn] = B_PAGE;
1823-
pool.bPageOffsets[pn] = cast(uint) npages;
1824-
if (npages > 1)
1825-
{
1826-
memset(&pool.pagetable[pn + 1], B_PAGEPLUS, npages - 1);
1827-
for (auto offset = 1; offset < npages; offset++)
1828-
pool.bPageOffsets[pn + offset] = cast(uint) offset;
1829-
}
18301822
usedLargePages += npages;
1831-
pool.freepages -= npages;
18321823

18331824
debug(PRINTF) printFreeInfo(&pool.base);
18341825

@@ -2756,7 +2747,7 @@ struct Pool
27562747
if (!pagetable)
27572748
onOutOfMemoryErrorNoGC();
27582749

2759-
if (isLargeObject)
2750+
if (isLargeObject && npages > 0)
27602751
{
27612752
bPageOffsets = cast(uint*)cstdlib.malloc(npages * uint.sizeof);
27622753
if (!bPageOffsets)
@@ -2798,7 +2789,10 @@ struct Pool
27982789
}
27992790

28002791
if (bPageOffsets)
2792+
{
28012793
cstdlib.free(bPageOffsets);
2794+
bPageOffsets = null;
2795+
}
28022796

28032797
mark.Dtor();
28042798
if (isLargeObject)
@@ -3034,6 +3028,37 @@ struct LargeObjectPool
30343028
Pool base;
30353029
alias base this;
30363030

3031+
debug(INVARIANT)
3032+
void Invariant()
3033+
{
3034+
//base.Invariant();
3035+
for (size_t n = 0; n < npages; )
3036+
{
3037+
uint np = bPageOffsets[n];
3038+
assert(np > 0 && np <= npages - n);
3039+
3040+
if (pagetable[n] == B_PAGE)
3041+
{
3042+
for (uint p = 1; p < np; p++)
3043+
{
3044+
assert(pagetable[n + p] == B_PAGEPLUS);
3045+
assert(bPageOffsets[n + p] == p);
3046+
}
3047+
}
3048+
else if (pagetable[n] == B_FREE)
3049+
{
3050+
for (uint p = 1; p < np; p++)
3051+
{
3052+
assert(pagetable[n + p] == B_FREE);
3053+
}
3054+
assert(bPageOffsets[n + np - 1] == np);
3055+
}
3056+
else
3057+
assert(false);
3058+
n += np;
3059+
}
3060+
}
3061+
30373062
/**
30383063
* Allocate n pages from Pool.
30393064
* Returns OPFAIL on failure.
@@ -3061,11 +3086,22 @@ struct LargeObjectPool
30613086
if (p > n)
30623087
{
30633088
setFreePageOffsets(i + n, p - n);
3064-
return i;
3089+
goto L_found;
30653090
}
30663091
if (p == n)
3092+
{
3093+
L_found:
3094+
pagetable[i] = B_PAGE;
3095+
bPageOffsets[i] = cast(uint) n;
3096+
if (n > 1)
3097+
{
3098+
memset(&pagetable[i + 1], B_PAGEPLUS, n - 1);
3099+
for (auto offset = 1; offset < n; offset++)
3100+
bPageOffsets[i + offset] = cast(uint) offset;
3101+
}
3102+
freepages -= n;
30673103
return i;
3068-
3104+
}
30693105
if (p > largest)
30703106
largest = p;
30713107

0 commit comments

Comments
 (0)