[Pixman] Making ref counting thread safe

Christian Hergert christian.hergert at gmail.com
Thu Dec 23 13:00:54 PST 2010

Hi Folks,

I've been using cairo to do some threaded rendering using an image surface.
After the rendering completes, it is pushed to an Xlib surface via the Gtk+
main loop. However, being that pixman_image_ref() and pixman_image_unref()
use ++ and -- to increment and decrement ref counts, occasionally I get a
double free in libc. Obviously, this only occurs under the scenario of many
concurrent renderings.

If I where to go through and work on making the reference counting thread safe,
what things would I need to make sure I take into account for the patch to be
accepted? For example:

  * Do we just need to use __sync_fetch_and_add()/__sync_sub_and_fetch()
    within the functions?
  * Should we abstract the atomic operations to support compilers other
    than GCC? If so, what compilers do we need to support?
  * Do we wan't to fallback to ++/-- when used under X since threading
    isn't needed? (Add something like pixman_thread_init()).
  * Is it okay to start with just pixman_image_t and support others
    in future patches?

Looking forward to your comments and suggestions.

-- Christian

More information about the Pixman mailing list