On Sun, 1 Jun 2008, Yu Feng wrote:

> Hi all, not sure if it is appropriate here, but I don't quite understand
> the code in g_object_unref:
>
> glib-2.16.1/gobject/gobject.c: line:1763
>  /* here we want to atomically do: if (ref_count>1) { ref_count--;
> return; } */
> retry_atomic_decrement1:
>  old_ref = g_atomic_int_get (&object->ref_count);
>  if (old_ref > 1)
>    {
>      if (!g_atomic_int_compare_and_exchange (&object->ref_count,
> old_ref, old_ref - 1))
>    goto retry_atomic_decrement1;
>
>
> How does the code achieve the goal stated in the comments? It seems to
> me that the code will loop at retry_atomic_decrement1 untill old_ref ==
> 1?

no, it loops until object->ref_count == old_ref-1, which implements
the functionality outlined in the comment. you possibly want to read
up on g_atomic_int_compare_and_exchange() and maybe CAS (compare-and-swap)
algorithms in general.

> Yu

---
ciaoTJ
_______________________________________________
gtk-devel-list mailing list
gtk-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-devel-list

Reply via email to