1
- import { DEBUG , BLOCK_OVERHEAD } from "rt/common" ;
2
- import { Block , freeBlock , ROOT } from "rt/tlsf" ;
1
+ import { DEBUG , BLOCK_OVERHEAD , root } from "rt/common" ;
2
+ import { Block , freeBlock } from "rt/tlsf" ;
3
3
import { TypeinfoFlags } from "shared/typeinfo" ;
4
4
import { onincrement , ondecrement , onfree , onalloc } from "./rtrace" ;
5
5
@@ -124,10 +124,10 @@ function decrement(s: Block): void {
124
124
__visit_members ( changetype < usize > ( s ) + BLOCK_OVERHEAD , VISIT_DECREMENT ) ;
125
125
if ( isDefined ( __GC_ALL_ACYCLIC ) ) {
126
126
if ( DEBUG ) assert ( ! ( info & BUFFERED_MASK ) ) ;
127
- freeBlock ( ROOT , s ) ;
127
+ freeBlock ( s ) ;
128
128
} else {
129
129
if ( ! ( info & BUFFERED_MASK ) ) {
130
- freeBlock ( ROOT , s ) ;
130
+ freeBlock ( s ) ;
131
131
} else {
132
132
s . gcInfo = BUFFERED_MASK | COLOR_BLACK | 0 ;
133
133
}
@@ -149,31 +149,25 @@ function decrement(s: Block): void {
149
149
}
150
150
}
151
151
152
- /** Buffer of possible roots. */
153
- // @ts -ignore: decorator
154
- @lazy var ROOTS : usize ;
155
- /** Current absolute offset into the `ROOTS` buffer. */
156
- // @ts -ignore: decorator
157
- @lazy var CUR : usize = 0 ;
158
- /** Current absolute end offset into the `ROOTS` buffer. */
159
- // @ts -ignore: decorator
160
- @lazy var END : usize = 0 ;
152
+ // root.data1 : Buffer of possible roots
153
+ // root.data2 : Current absolute offset into the buffer
154
+ // root.data3 : Current absolute end offset into the buffer
161
155
162
156
/** Appends a block to possible roots. */
163
157
function appendRoot ( s : Block ) : void {
164
- var cur = CUR ;
165
- if ( cur >= END ) {
158
+ var cur = root . data2 ;
159
+ if ( cur >= root . data3 ) {
166
160
growRoots ( ) ; // TBD: either that or pick a default and force collection on overflow
167
- cur = CUR ;
161
+ cur = root . data2 ;
168
162
}
169
163
store < Block > ( cur , s ) ;
170
- CUR = cur + sizeof < usize > ( ) ;
164
+ root . data2 = cur + sizeof < usize > ( ) ;
171
165
}
172
166
173
167
/** Grows the roots buffer if it ran full. */
174
168
function growRoots ( ) : void {
175
- var oldRoots = ROOTS ;
176
- var oldSize = CUR - oldRoots ;
169
+ var oldRoots = root . data1 ;
170
+ var oldSize = root . data2 - oldRoots ;
177
171
var newSize = max ( oldSize * 2 , 64 << alignof < usize > ( ) ) ;
178
172
var newRoots = __alloc ( newSize , 0 ) ;
179
173
if ( isDefined ( ASC_RTRACE ) ) onfree ( changetype < Block > ( newRoots - BLOCK_OVERHEAD ) ) ; // neglect unmanaged
@@ -182,9 +176,9 @@ function growRoots(): void {
182
176
if ( isDefined ( ASC_RTRACE ) ) onalloc ( changetype < Block > ( oldRoots - BLOCK_OVERHEAD ) ) ; // neglect unmanaged
183
177
__free ( oldRoots ) ;
184
178
}
185
- ROOTS = newRoots ;
186
- CUR = newRoots + oldSize ;
187
- END = newRoots + newSize ;
179
+ root . data1 = newRoots ;
180
+ root . data2 = newRoots + oldSize ;
181
+ root . data3 = newRoots + newSize ;
188
182
}
189
183
190
184
/** Collects cyclic garbage. */
@@ -194,9 +188,9 @@ export function __collect(): void {
194
188
if ( isDefined ( __GC_ALL_ACYCLIC ) ) return ;
195
189
196
190
// markRoots
197
- var roots = ROOTS ;
191
+ var roots = root . data1 ;
198
192
var cur = roots ;
199
- for ( let pos = cur , end = CUR ; pos < end ; pos += sizeof < usize > ( ) ) {
193
+ for ( let pos = cur , end = root . data2 ; pos < end ; pos += sizeof < usize > ( ) ) {
200
194
let s = load < Block > ( pos ) ;
201
195
let info = s . gcInfo ;
202
196
if ( ( info & COLOR_MASK ) == COLOR_PURPLE && ( info & REFCOUNT_MASK ) > 0 ) {
@@ -205,13 +199,13 @@ export function __collect(): void {
205
199
cur += sizeof < usize > ( ) ;
206
200
} else {
207
201
if ( ( info & COLOR_MASK ) == COLOR_BLACK && ! ( info & REFCOUNT_MASK ) ) {
208
- freeBlock ( ROOT , s ) ;
202
+ freeBlock ( s ) ;
209
203
} else {
210
204
s . gcInfo = info & ~ BUFFERED_MASK ;
211
205
}
212
206
}
213
207
}
214
- CUR = cur ;
208
+ root . data2 = cur ;
215
209
216
210
// scanRoots
217
211
for ( let pos = roots ; pos < cur ; pos += sizeof < usize > ( ) ) {
@@ -224,7 +218,7 @@ export function __collect(): void {
224
218
s . gcInfo = s . gcInfo & ~ BUFFERED_MASK ;
225
219
collectWhite ( s ) ;
226
220
}
227
- CUR = roots ;
221
+ root . data2 = roots ;
228
222
}
229
223
230
224
/** Marks a block as gray (possible member of cycle) during the collection phase. */
@@ -261,7 +255,7 @@ function collectWhite(s: Block): void {
261
255
if ( ( info & COLOR_MASK ) == COLOR_WHITE && ! ( info & BUFFERED_MASK ) ) {
262
256
s . gcInfo = ( info & ~ COLOR_MASK ) | COLOR_BLACK ;
263
257
__visit_members ( changetype < usize > ( s ) + BLOCK_OVERHEAD , VISIT_COLLECTWHITE ) ;
264
- freeBlock ( ROOT , s ) ;
258
+ freeBlock ( s ) ;
265
259
}
266
260
}
267
261
0 commit comments