On 12.10.2013 20:31, deadalnix wrote:
On Saturday, 12 October 2013 at 06:16:24 UTC, Rainer Schuetze wrote:
in pseudo-assembly missing null-checks:
Thread1 (R = P) Thread2 (S = R)
mov ecx,[R]
; thread suspended
You need an sequentially consistent write. You also need to increment
the refcount BEFORE ! This codegen is incorrect.
How do you increment the counter without reading its address?
mov eax,[P]
inc [eax].refcnt
Same here.
Same here ;-)
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.
This can be done atomically (even with eventually consistent increment,
don't need full sequential consistency here, you still need fully
sequential consistent decrement).
According to the "Handbook of Garbage Collection" by Richard Jones eager
lock-free reference counting can only be done with a cas2 operation
modifying two seperate locations atomically (algorithm 18.2 "Eager
reference counting with CompareAndSwap is broken"). This might be the
quoted paper: http://scholr.ly/paper/2199608/lock-free-reference-counting
Unfortunately the CAS2 operation does not exist in most processors.