simple.c (d38ea87ac54af64ef611de434d07c12dc0399216) simple.c (cb8d4c8f54b8271f642f02382eec29d468bb1c77)
1/*
2 * Simple trace backend
3 *
4 * Copyright IBM, Corp. 2010
5 *
6 * This work is licensed under the terms of the GNU GPL, version 2. See
7 * the COPYING file in the top-level directory.
8 *

--- 94 unchanged lines hidden (view full) ---

103
104 if (!(record.event & TRACE_RECORD_VALID)) {
105 return false;
106 }
107
108 smp_rmb(); /* read memory barrier before accessing record */
109 /* read the record header to know record length */
110 read_from_buffer(idx, &record, sizeof(TraceRecord));
1/*
2 * Simple trace backend
3 *
4 * Copyright IBM, Corp. 2010
5 *
6 * This work is licensed under the terms of the GNU GPL, version 2. See
7 * the COPYING file in the top-level directory.
8 *

--- 94 unchanged lines hidden (view full) ---

103
104 if (!(record.event & TRACE_RECORD_VALID)) {
105 return false;
106 }
107
108 smp_rmb(); /* read memory barrier before accessing record */
109 /* read the record header to know record length */
110 read_from_buffer(idx, &record, sizeof(TraceRecord));
111 *recordptr = malloc(record.length); /* dont use g_malloc, can deadlock when traced */
111 *recordptr = malloc(record.length); /* don't use g_malloc, can deadlock when traced */
112 /* make a copy of record to avoid being overwritten */
113 read_from_buffer(idx, *recordptr, record.length);
114 smp_rmb(); /* memory barrier before clearing valid flag */
115 (*recordptr)->event &= ~TRACE_RECORD_VALID;
116 /* clear the trace buffer range for consumed record otherwise any byte
117 * with its MSB set may be considered as a valid event id when the writer
118 * thread crosses this range of buffer again.
119 */

--- 55 unchanged lines hidden (view full) ---

175 dropped_count, 0));
176 dropped.rec.arguments[0] = dropped_count;
177 unused = fwrite(&dropped.rec, dropped.rec.length, 1, trace_fp);
178 }
179
180 while (get_trace_record(idx, &recordptr)) {
181 unused = fwrite(recordptr, recordptr->length, 1, trace_fp);
182 writeout_idx += recordptr->length;
112 /* make a copy of record to avoid being overwritten */
113 read_from_buffer(idx, *recordptr, record.length);
114 smp_rmb(); /* memory barrier before clearing valid flag */
115 (*recordptr)->event &= ~TRACE_RECORD_VALID;
116 /* clear the trace buffer range for consumed record otherwise any byte
117 * with its MSB set may be considered as a valid event id when the writer
118 * thread crosses this range of buffer again.
119 */

--- 55 unchanged lines hidden (view full) ---

175 dropped_count, 0));
176 dropped.rec.arguments[0] = dropped_count;
177 unused = fwrite(&dropped.rec, dropped.rec.length, 1, trace_fp);
178 }
179
180 while (get_trace_record(idx, &recordptr)) {
181 unused = fwrite(recordptr, recordptr->length, 1, trace_fp);
182 writeout_idx += recordptr->length;
183 free(recordptr); /* dont use g_free, can deadlock when traced */
183 free(recordptr); /* don't use g_free, can deadlock when traced */
184 idx = writeout_idx % TRACE_BUF_LEN;
185 }
186
187 fflush(trace_fp);
188 }
189 return NULL;
190}
191

--- 195 unchanged lines hidden ---
184 idx = writeout_idx % TRACE_BUF_LEN;
185 }
186
187 fflush(trace_fp);
188 }
189 return NULL;
190}
191

--- 195 unchanged lines hidden ---