Index: net/disk_cache/trace.cc |
=================================================================== |
--- net/disk_cache/trace.cc (revision 199883) |
+++ net/disk_cache/trace.cc (working copy) |
@@ -9,7 +9,9 @@ |
#include <windows.h> |
#endif |
+#include "base/lazy_instance.h" |
#include "base/logging.h" |
+#include "base/synchronization/lock.h" |
#include "net/disk_cache/stress_support.h" |
// Change this value to 1 to enable tracing on a release build. By default, |
@@ -31,6 +33,7 @@ |
#endif |
bool s_trace_enabled = false; |
+base::LazyInstance<base::Lock>::Leaky s_lock = LAZY_INSTANCE_INITIALIZER; |
struct TraceBuffer { |
int num_traces; |
@@ -59,6 +62,8 @@ |
// Static. |
TraceObject* TraceObject::GetTraceObject() { |
+ base::AutoLock lock(s_lock.Get()); |
+ |
if (s_trace_object) |
return s_trace_object; |
@@ -75,6 +80,7 @@ |
} |
void TraceObject::EnableTracing(bool enable) { |
+ base::AutoLock lock(s_lock.Get()); |
s_trace_enabled = enable; |
} |
@@ -92,6 +98,8 @@ |
} |
void DestroyTrace(void) { |
+ base::AutoLock lock(s_lock.Get()); |
+ |
delete s_trace_buffer; |
s_trace_buffer = NULL; |
s_trace_object = NULL; |
@@ -103,28 +111,33 @@ |
va_list ap; |
va_start(ap, format); |
+ char line[kEntrySize + 2]; |
#if defined(OS_WIN) |
- vsprintf_s(s_trace_buffer->buffer[s_trace_buffer->current], format, ap); |
+ vsprintf_s(line, format, ap); |
#else |
- vsnprintf(s_trace_buffer->buffer[s_trace_buffer->current], |
- sizeof(s_trace_buffer->buffer[s_trace_buffer->current]), format, |
- ap); |
+ vsnprintf(line, kEntrySize, format, ap); |
#endif |
#if defined(DISK_CACHE_TRACE_TO_LOG) |
- char line[kEntrySize + 2]; |
- memcpy(line, s_trace_buffer->buffer[s_trace_buffer->current], kEntrySize); |
line[kEntrySize] = '\0'; |
LOG(INFO) << line; |
#endif |
- s_trace_buffer->num_traces++; |
- s_trace_buffer->current++; |
- if (s_trace_buffer->current == kNumberOfEntries) |
- s_trace_buffer->current = 0; |
+ va_end(ap); |
- va_end(ap); |
+ { |
+ base::AutoLock lock(s_lock.Get()); |
+ if (!s_trace_buffer || !s_trace_enabled) |
+ return; |
+ |
+ memcpy(s_trace_buffer->buffer[s_trace_buffer->current], line, kEntrySize); |
+ |
+ s_trace_buffer->num_traces++; |
+ s_trace_buffer->current++; |
+ if (s_trace_buffer->current == kNumberOfEntries) |
+ s_trace_buffer->current = 0; |
+ } |
} |
// Writes the last num_traces to the debugger output. |