Open the Sky
diff --git a/sky/viewer/services/tracing_impl.cc b/sky/viewer/services/tracing_impl.cc
new file mode 100644
index 0000000..755e0dd
--- /dev/null
+++ b/sky/viewer/services/tracing_impl.cc
@@ -0,0 +1,71 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "sky/viewer/services/tracing_impl.h"
+
+#include "base/callback.h"
+#include "base/debug/trace_event.h"
+#include "base/files/file_util.h"
+
+namespace sky {
+namespace {
+
+static bool g_tracing = false;
+static int g_blocks = 0;
+static FILE* g_trace_file = NULL;
+
+void WriteTraceDataCollected(
+    const scoped_refptr<base::RefCountedString>& events_str,
+    bool has_more_events) {
+  if (g_blocks) {
+    fwrite(",", 1, 1, g_trace_file);
+  }
+  ++g_blocks;
+  fwrite(
+      events_str->data().c_str(), 1, events_str->data().length(), g_trace_file);
+  if (!has_more_events) {
+    fwrite("]}", 1, 2, g_trace_file);
+    base::CloseFile(g_trace_file);
+    g_trace_file = NULL;
+    g_blocks = 0;
+  }
+}
+
+void StopTracingAndFlushToDisk() {
+  base::debug::TraceLog::GetInstance()->SetDisabled();
+
+  g_trace_file = base::OpenFile(
+      base::FilePath(FILE_PATH_LITERAL("sky_viewer.trace")), "w+");
+  static const char start[] = "{\"traceEvents\":[";
+  fwrite(start, 1, strlen(start), g_trace_file);
+  base::debug::TraceLog::GetInstance()->Flush(
+      base::Bind(&WriteTraceDataCollected));
+}
+
+}
+
+TracingImpl::TracingImpl() {
+}
+
+TracingImpl::~TracingImpl() {
+}
+
+void TracingImpl::Start() {
+  if (g_tracing)
+    return;
+  g_tracing = true;
+  base::debug::TraceLog::GetInstance()->SetEnabled(
+      base::debug::CategoryFilter("*"),
+      base::debug::TraceLog::RECORDING_MODE,
+      base::debug::TraceOptions(base::debug::RECORD_UNTIL_FULL));
+}
+
+void TracingImpl::Stop() {
+  if (!g_tracing)
+    return;
+  g_tracing = false;
+  StopTracingAndFlushToDisk();
+}
+
+}  // namespace sky