Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3030)

Unified Diff: base/debug/trace_event.cc

Issue 7866026: Added trace query code and wired tracing through BrowserProxy so tests can run traces. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/debug/trace_event.h ('k') | base/debug/trace_event_test_utils.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/debug/trace_event.cc
diff --git a/base/debug/trace_event.cc b/base/debug/trace_event.cc
index 879f3a978f9361900a8658b61c4ead4ef5f75f0b..cfaa2b38da185b725e071f82f3fb4efb20ab2b51 100644
--- a/base/debug/trace_event.cc
+++ b/base/debug/trace_event.cc
@@ -10,13 +10,16 @@
#include "base/debug/trace_event_win.h"
#endif
#include "base/format_macros.h"
+#include "base/json/json_reader.h"
#include "base/memory/ref_counted_memory.h"
+#include "base/memory/scoped_ptr.h"
#include "base/process_util.h"
#include "base/stringprintf.h"
#include "base/threading/thread_local.h"
#include "base/utf_string_conversions.h"
#include "base/stl_util.h"
#include "base/time.h"
+#include "base/values.h"
#define USE_UNRELIABLE_NOW
@@ -126,6 +129,21 @@ const char* GetPhaseStr(TraceEventPhase phase) {
}
}
+TraceEventPhase GetPhaseFromStr(const char* phase) {
+ switch(*phase) {
+ case 'B':
+ return TRACE_EVENT_PHASE_BEGIN;
+ case 'I':
+ return TRACE_EVENT_PHASE_INSTANT;
+ case 'E':
+ return TRACE_EVENT_PHASE_END;
+ case 'M':
+ return TRACE_EVENT_PHASE_METADATA;
+ default:
+ return TRACE_EVENT_PHASE_BEGIN;
+ }
+}
+
size_t GetAllocLength(const char* str) { return str ? strlen(str) + 1 : 0; }
// Copies |*member| into |*buffer|, sets |*member| to point to this new
@@ -143,6 +161,124 @@ void CopyTraceEventParameter(char** buffer,
} // namespace
+TestTraceEvent::TestTraceEvent()
+ : pid_tid(0, 0),
+ timestamp(0),
+ phase(TRACE_EVENT_PHASE_BEGIN),
+ associated_event(NULL) {
+}
+
+TestTraceEvent::TestTraceEvent(const base::Value* event_value)
+ : pid_tid(0, 0),
+ timestamp(0),
+ phase(TRACE_EVENT_PHASE_BEGIN),
+ associated_event(NULL) {
+ if (event_value->GetType() != base::Value::TYPE_DICTIONARY)
+ return;
+ const base::DictionaryValue* dictionary =
+ static_cast<const base::DictionaryValue*>(event_value);
+
+ std::string phase_str;
+ base::DictionaryValue* args = NULL;
+
+ if (dictionary->GetInteger("pid", &pid_tid.pid) &&
+ dictionary->GetInteger("tid", &pid_tid.tid) &&
+ dictionary->GetDouble("ts", &timestamp) &&
+ dictionary->GetString("cat", &category) &&
+ dictionary->GetString("name", &name) &&
+ dictionary->GetString("ph", &phase_str) &&
+ dictionary->GetDictionary("args", &args)) {
+
+ phase = GetPhaseFromStr(phase_str.c_str());
+
+ // For each argument, copy the type and create a TraceValue.
+ base::DictionaryValue::key_iterator keyi = args->begin_keys();
+ for (; keyi != args->end_keys(); ++keyi) {
+ std::string str;
+ bool boolean = false;
+ int int_num = 0;
+ double double_num = 0.0;
+ Value* value = NULL;
+ if (args->GetWithoutPathExpansion(*keyi, &value)) {
+ if (value->GetAsString(&str))
+ arg_strings[*keyi] = str;
+ else if (value->GetAsInteger(&int_num))
+ arg_numbers[*keyi] = static_cast<double>(int_num);
+ else if (value->GetAsBoolean(&boolean))
+ arg_numbers[*keyi] = static_cast<double>(boolean ? 1 : 0);
+ else if (value->GetAsDouble(&double_num))
+ arg_numbers[*keyi] = double_num;
+ }
+ }
+ }
+}
+
+TestTraceEvent::~TestTraceEvent() {
+}
+
+bool TestTraceEvent::ParseEventsFromJson(const std::string& json,
+ std::vector<TestTraceEvent>* output) {
+ scoped_ptr<base::Value> root;
+ root.reset(base::JSONReader::Read(json, false));
+
+ ListValue* root_list = NULL;
+ if (!root.get() || !root->GetAsList(&root_list))
+ return false;
+
+ for (size_t i = 0; i < root_list->GetSize(); ++i) {
+ Value* item = NULL;
+ if (root_list->Get(i, &item))
+ output->push_back(TestTraceEvent(item));
+ }
+
+ return true;
+}
+
+bool TestTraceEvent::GetDuration(double* duration) const {
+ if (!associated_event)
+ return false;
+
+ if (phase == TRACE_EVENT_PHASE_BEGIN) {
+ DCHECK(associated_event->phase == TRACE_EVENT_PHASE_END);
+ *duration = associated_event->timestamp - timestamp;
+ } else {
+ DCHECK(phase == TRACE_EVENT_PHASE_END);
+ DCHECK(associated_event->phase == TRACE_EVENT_PHASE_BEGIN);
+ *duration = timestamp - associated_event->timestamp;
+ }
+ return true;
+}
+
+bool TestTraceEvent::IsArg(const std::string& name) const {
+ return arg_numbers.find(name) != arg_numbers.end() ||
+ arg_strings.find(name) != arg_strings.end();
+}
+
+bool TestTraceEvent::GetArgAsString(const std::string& name,
+ std::string* arg) const {
+ std::map<std::string, std::string>::const_iterator i = arg_strings.find(name);
+ if (i != arg_strings.end()) {
+ *arg = i->second;
+ return true;
+ }
+ return false;
+}
+
+bool TestTraceEvent::GetArgAsNumber(const std::string& name,
+ double* arg) const {
+ std::map<std::string, double>::const_iterator i = arg_numbers.find(name);
+ if (i != arg_numbers.end()) {
+ *arg = i->second;
+ return true;
+ }
+ return false;
+}
+
+void TestTraceEvent::SetAssociatedEvent(TestTraceEvent* event) {
+ associated_event = event;
+ event->associated_event = this;
+}
+
TraceEvent::TraceEvent()
: process_id_(0),
thread_id_(0),
« no previous file with comments | « base/debug/trace_event.h ('k') | base/debug/trace_event_test_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698