Related articles |
---|
Garbage collection and optimization rayiner@gmail.com (Rayiner Hashem) (2007-11-05) |
Re: Garbage collection and optimization bonzini@gnu.org (Paolo Bonzini) (2007-11-08) |
From: | Paolo Bonzini <bonzini@gnu.org> |
Newsgroups: | comp.compilers |
Date: | Thu, 08 Nov 2007 09:59:28 -0000 |
Organization: | Compilers Central |
References: | 07-11-020 |
Keywords: | GC, parallel |
Posted-Date: | 08 Nov 2007 14:48:13 EST |
> cons* alloc_cons(cons* car, cons* cdr) {
> if((alloc_ptr + sizeof(cons)) > alloc_limit)
> make_more_space();
>
> cons* obj = (cons*)alloc_ptr;
> obj->car = car; /* one */
> obj->cdr = cdr; /* two */
> alloc_ptr += sizeof(cons); /* three */
> return obj;
> }
>
> If the GC interrupts before 'one' or after 'three', we're fine. 'car'
> and 'cons' will remain live since their values will be used later.
> However, what happens when the GC interrupts between 'one' and 'two'?
>
> What solutions to this problem are used in practice?
You have a special root set for objects being constructed. In one
design the GC will keep them alive but not scan them; or you
initialize the object fields to "null" at the moment you initialize
them. In both cases you "bump the pointer" before you start to fill
the object fields.
In the former case, all three of "obj", "car", "cdr" will have to be
in the special root set. In the latter, only "obj" will have to be
put there.
So it will be something like:
/* caller must have put car and cdr on root set, telling GC to scan
them */
/* do the following two atomically! */
cons* obj = (cons*)((alloc_ptr += sizeof(cons)) - sizeof(cons));
put obj on root set, it will not be scanned
obj->car = car; /* one */
obj->cdr = cdr; /* two */
or
/* caller must have put car and cdr on root set */
/* GC makes sure that memory at alloc_ptr is filled with nulls */
/* do the following two atomically! */
cons* obj = (cons*)((alloc_ptr += sizeof(cons)) - sizeof(cons));
put obj on root set
obj->car = car; /* one */
obj->cdr = cdr; /* two */
Return to the
comp.compilers page.
Search the
comp.compilers archives again.