draft proposal for ref counting in D

Walter Bright newshound2 at digitalmars.com
Wed Oct 9 19:21:53 PDT 2013


Rainer Schuetze wrote:

On 29.06.2013 06:38, Walter Bright wrote:
 >
 > On 6/27/2013 11:33 AM, Rainer Schuetze wrote:
 >> On 27.06.2013 19:04, Walter Bright wrote:
 >>>> IIRC you also have the GC handbook book on your shelf. Check the
 >>>> chapters on RC, especially algorithm 18.2 "Eager reference counting
 >>>> with
 >>>> CompareAndSwap is broken".
 >>>
 >>> I have the book, but it is the first edition and there's no chapter 18
 >>> in it :-(
 >>
 >> I can remove the dust from my scanner to copy the 3 mostly relevant
 >> pages and send them to you.
 >>
 >>

I tried to scan it yesterday, but got large black bar at the fold (don't know if 
this the correct term) that eraased the first inch of text. I would have to rip 
the book apart to get better results.

 >
 > I understand the issue (I think), but I can't think of a case where the
 > ref count would be 1 when this happens.
 >
 >


Consider a global shared reference R that holds the last reference to an object 
O. One thread exchanges the reference with another reference P while another 
thread reads the reference into S.

shared(C) R = O;      ; refcnt of O is 1

in pseudo-assembly missing null-checks:

Thread1 (R = P)        Thread2 (S = R)

                        mov ecx,[R]
                        ; thread suspended
mov eax,[P]
inc [eax].refcnt
mov ebx,[R]
mov [R],eax
dec [ebx].refcnt      ; refcnt of O now 0
jnz done
call delete_ebx
                        ; thread resumed
                        inc [ecx].refcnt
done:

The increment on [ecx].refcnt modifies garbage.


More information about the Digitalmars-d mailing list