On Wed, Mar 23, 2011 at 7:39 AM, Stefan Hajnoczi <stefa...@gmail.com> wrote: > On Tue, Mar 22, 2011 at 11:52 PM, Andreas Färber <andreas.faer...@web.de> > wrote: >> Am 28.02.2011 um 10:38 schrieb Stefan Hajnoczi: >> >>> Trace events outside the global mutex cannot be used with the simple >>> trace backend since it is not thread-safe. There is no check to prevent >>> them being enabled so people sometimes learn this the hard way. >>> >>> This patch restructures the simple trace backend with a ring buffer >>> suitable for multiple concurrent writers. A writeout thread empties the >>> trace buffer when threshold fill levels are reached. Should the >>> writeout thread be unable to keep up with trace generation, records will >>> simply be dropped. >>> >>> Each time events are dropped a special record is written to the trace >>> file indicating how many events were dropped. The event ID is >>> 0xfffffffffffffffe and its signature is dropped(uint32_t count). >>> >>> Signed-off-by: Stefan Hajnoczi <stefa...@linux.vnet.ibm.com> >>> --- >>> v2: >>> * Add 'dropped' event so we know when events were lost. >> >> [...] >>> >>> + __sync_synchronize(); /* read memory barrier before accessing record >>> */ >> >> Getting this at HEAD on Darwin/ppc64: >> >> CC simpletrace.o >> /Users/andreas/QEMU/qemu/simpletrace.c: In function ‘get_trace_record’: >> /Users/andreas/QEMU/qemu/simpletrace.c:81: warning: implicit declaration of >> function ‘__sync_synchronize’ >> /Users/andreas/QEMU/qemu/simpletrace.c:81: warning: nested extern >> declaration of ‘__sync_synchronize’ >> /Users/andreas/QEMU/qemu/simpletrace.c: In function ‘trace’: >> /Users/andreas/QEMU/qemu/simpletrace.c:161: warning: implicit declaration of >> function ‘__sync_fetch_and_add’ >> /Users/andreas/QEMU/qemu/simpletrace.c:161: warning: nested extern >> declaration of ‘__sync_fetch_and_add’ >> [...] >> LINK qemu-nbd >> Undefined symbols: >> "___sync_fetch_and_add", referenced from: >> _trace in simpletrace.o >> "___sync_synchronize", referenced from: >> _get_trace_record in simpletrace.o >> _trace in simpletrace.o >> ld: symbol(s) not found >> collect2: ld returned 1 exit status >> make: *** [qemu-nbd] Error 1 >> >> Haven't investigated further yet. > > /me shakes his fist at Apple gcc! > > These are gcc builtins, I believe the were added in gcc 4.1: > http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html#Atomic-Builtins > > Which version of gcc are you running? > > We can replace them with equivalent library functions or inline > assembly code. Here's what we need: > Read memory barrier > Write memory barrier > Atomic load and increment > > CCed Alex and Anthony who may have thoughts on adding these atomic ops to > QEMU.
Thinking about it more, the way I'd like to solve this (and make simpletrace work on Windows too!) is to go ahead and use glib threads and atomics. I don't want to be in the business of writing portability wrappers for different OSes and architectures, and glib already does this: file:///usr/share/doc/libglib2.0-doc/glib/glib-Atomic-Operations.html#g-atomic-int-exchange-and-add Stefan