// is moved/flushed to the work buffer (Workbuf).
// The size of an intermediate buffer is very small,
// such as 32 or 64 elements.
+typedef struct PtrTarget PtrTarget;
struct PtrTarget
{
void *p;
uintptr ti;
};
+typedef struct BitTarget BitTarget;
struct BitTarget
{
void *p;
uintptr *bitp, shift;
};
+typedef struct BufferList BufferList;
struct BufferList
{
- struct PtrTarget ptrtarget[IntermediateBufferCapacity];
- struct BitTarget bittarget[IntermediateBufferCapacity];
- struct BufferList *next;
+ PtrTarget ptrtarget[IntermediateBufferCapacity];
+ BitTarget bittarget[IntermediateBufferCapacity];
+ BufferList *next;
};
-static struct BufferList *bufferList;
+static BufferList *bufferList;
static Lock lock;
// flushptrbuf
// (2nd part, mark and enqueue)
static void
-flushptrbuf(struct PtrTarget *ptrbuf, uintptr n, Obj **_wp, Workbuf **_wbuf, uintptr *_nobj, struct BitTarget *bitbuf)
+flushptrbuf(PtrTarget *ptrbuf, uintptr n, Obj **_wp, Workbuf **_wbuf, uintptr *_nobj, BitTarget *bitbuf)
{
byte *p, *arena_start, *obj;
uintptr size, *bitp, bits, shift, j, x, xbits, off, nobj, ti;
PageID k;
Obj *wp;
Workbuf *wbuf;
- struct PtrTarget *ptrbuf_end;
- struct BitTarget *bitbufpos, *bt;
+ PtrTarget *ptrbuf_end;
+ BitTarget *bitbufpos, *bt;
arena_start = runtime·mheap.arena_start;
if((bits & (bitAllocated|bitMarked)) != bitAllocated)
continue;
- *bitbufpos = (struct BitTarget){obj, ti, bitp, shift};
+ *bitbufpos = (BitTarget){obj, ti, bitp, shift};
bitbufpos++;
}
uintptr *pc;
- struct BufferList *scanbuffers;
- struct PtrTarget *ptrbuf, *ptrbuf_end;
- struct BitTarget *bitbuf;
+ BufferList *scanbuffers;
+ PtrTarget *ptrbuf, *ptrbuf_end;
+ BitTarget *bitbuf;
- struct PtrTarget *ptrbufpos;
+ PtrTarget *ptrbufpos;
// End of local variable declarations.
obj = *(byte**)i;
if(obj >= arena_start && obj < arena_used) {
- *ptrbufpos = (struct PtrTarget){obj, 0};
+ *ptrbufpos = (PtrTarget){obj, 0};
ptrbufpos++;
if(ptrbufpos == ptrbuf_end)
goto flush_buffers;