]> git.proxmox.com Git - qemu.git/commitdiff
trace: Direct access of atomics is verboten, use the API
authorMarkus Armbruster <armbru@redhat.com>
Fri, 25 Jan 2013 15:43:38 +0000 (16:43 +0100)
committerStefan Hajnoczi <stefanha@redhat.com>
Tue, 5 Feb 2013 20:52:55 +0000 (21:52 +0100)
The GLib Reference Manual says:

    It is very important that all accesses to a particular integer or
    pointer be performed using only this API and that different sizes
    of operation are not mixed or used on overlapping memory
    regions. Never read or assign directly from or to a value --
    always use this API.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Harsh Prateek Bora <harsh@linux.vnet.ibm.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
trace/simple.c

index ccbdb6a9306ca5446c6dd37bedabbd86df9c84ab..592ff483cc0beffd86ba9bb997f73d635e8a61b0 100644 (file)
@@ -166,13 +166,13 @@ static gpointer writeout_thread(gpointer opaque)
     for (;;) {
         wait_for_trace_records_available();
 
-        if (dropped_events) {
+        if (g_atomic_int_get(&dropped_events)) {
             dropped.rec.event = DROPPED_EVENT_ID,
             dropped.rec.timestamp_ns = get_clock();
             dropped.rec.length = sizeof(TraceRecord) + sizeof(uint64_t),
             dropped.rec.reserved = 0;
             while (1) {
-                dropped_count = dropped_events;
+                dropped_count = g_atomic_int_get(&dropped_events);
                 if (g_atomic_int_compare_and_exchange(&dropped_events,
                                                       dropped_count, 0)) {
                     break;
@@ -214,7 +214,7 @@ int trace_record_start(TraceBufferRecord *rec, TraceEventID event, size_t datasi
     uint64_t timestamp_ns = get_clock();
 
     while (1) {
-        old_idx = trace_idx;
+        old_idx = g_atomic_int_get(&trace_idx);
         smp_rmb();
         new_idx = old_idx + rec_len;
 
@@ -275,7 +275,8 @@ void trace_record_finish(TraceBufferRecord *rec)
     record.event |= TRACE_RECORD_VALID;
     write_to_buffer(rec->tbuf_idx, &record, sizeof(TraceRecord));
 
-    if ((trace_idx - writeout_idx) > TRACE_BUF_FLUSH_THRESHOLD) {
+    if ((g_atomic_int_get(&trace_idx) - writeout_idx)
+        > TRACE_BUF_FLUSH_THRESHOLD) {
         flush_trace_file(false);
     }
 }