+
+ /* now wait until all writers have completed their write before we move the
+ * tail_read to this new item. It is possible that other writers are still
+ * updating the previous array slots and we don't want to reveal their changes
+ * before they are done. FIXME, it would be nice if we didn't have to busy
+ * wait here. */
+ while G_UNLIKELY
+ (!g_atomic_int_compare_and_exchange (&tail_mem->tail_read, tail, tail + 1));