@@ -786,7 +786,7 @@ class ConservativeGC : GC
786
786
debug (MEMSTOMP ) memset(pool.baseAddr + (pagenum + psz) * PAGESIZE , 0xF0 , sz * PAGESIZE );
787
787
memset(lpool.pagetable + pagenum + psz, B_PAGEPLUS , sz);
788
788
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++ )
790
790
lpool.bPageOffsets[pagenum + offset] = cast (uint ) offset;
791
791
if (freesz > sz)
792
792
lpool.setFreePageOffsets(pagenum + psz + sz, freesz - sz);
@@ -1819,16 +1819,7 @@ struct Gcx
1819
1819
assert (pool);
1820
1820
1821
1821
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
- }
1830
1822
usedLargePages += npages;
1831
- pool.freepages -= npages;
1832
1823
1833
1824
debug (PRINTF ) printFreeInfo(&pool.base);
1834
1825
@@ -2756,7 +2747,7 @@ struct Pool
2756
2747
if (! pagetable)
2757
2748
onOutOfMemoryErrorNoGC();
2758
2749
2759
- if (isLargeObject)
2750
+ if (isLargeObject && npages > 0 )
2760
2751
{
2761
2752
bPageOffsets = cast (uint * )cstdlib.malloc(npages * uint .sizeof);
2762
2753
if (! bPageOffsets)
@@ -2798,7 +2789,10 @@ struct Pool
2798
2789
}
2799
2790
2800
2791
if (bPageOffsets)
2792
+ {
2801
2793
cstdlib.free(bPageOffsets);
2794
+ bPageOffsets = null ;
2795
+ }
2802
2796
2803
2797
mark.Dtor();
2804
2798
if (isLargeObject)
@@ -3034,6 +3028,37 @@ struct LargeObjectPool
3034
3028
Pool base;
3035
3029
alias base this ;
3036
3030
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
+
3037
3062
/**
3038
3063
* Allocate n pages from Pool.
3039
3064
* Returns OPFAIL on failure.
@@ -3061,11 +3086,22 @@ struct LargeObjectPool
3061
3086
if (p > n)
3062
3087
{
3063
3088
setFreePageOffsets(i + n, p - n);
3064
- return i ;
3089
+ goto L_found ;
3065
3090
}
3066
3091
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;
3067
3103
return i;
3068
-
3104
+ }
3069
3105
if (p > largest)
3070
3106
largest = p;
3071
3107
0 commit comments