Idea #1 on integrating RC with GC

Ola Fosheim Grøstad" <ola.fosheim.grostad+dlang at gmail.com> Ola Fosheim Grøstad" <ola.fosheim.grostad+dlang at gmail.com>
Wed Feb 5 09:57:57 PST 2014


On Wednesday, 5 February 2014 at 17:24:46 UTC, Ola Fosheim 
Grøstad wrote:
> The access would be easy and something like (probably not 100% 
> correct):
>
> counter_addr = (ptr&~0xffff) + ( (ptr>>12)&0xfffc )

It was of course wrong, that would make the smallest allocation 
unit 16KiB. Anyway, if tuned to the indexed loads of the CPU then 
it would not be all the slow. On the x86 you should be able to do 
something like (pseudo):

uint64 reg1 = ptr & 0xfff....f0000
uint32 reg2 = ptr >> 8
uint64 reg3 = load_effective_address( reg1 + 4*reg2 )
increment( *reg3 )

So only 4-5 cheap instructions for single threaded counting.

You could also use the most significant bit for bookkeeping of 
single-threaded vs multi-threaded ref counting:

    test (*reg3)
    if (positive) goto nolock:
    lockprefix
nolock:
    increment( *reg3 )


More information about the Digitalmars-d mailing list