Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/debug/trace_event.h" | 5 #include "base/debug/trace_event.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 65 | 65 |
| 66 } // namespace | 66 } // namespace |
| 67 | 67 |
| 68 //////////////////////////////////////////////////////////////////////////////// | 68 //////////////////////////////////////////////////////////////////////////////// |
| 69 // | 69 // |
| 70 // TraceValue | 70 // TraceValue |
| 71 // | 71 // |
| 72 //////////////////////////////////////////////////////////////////////////////// | 72 //////////////////////////////////////////////////////////////////////////////// |
| 73 | 73 |
| 74 void TraceValue::AppendAsJSON(std::string* out) const { | 74 void TraceValue::AppendAsJSON(std::string* out) const { |
| 75 char temp_string[128]; | |
| 76 std::string::size_type start_pos; | 75 std::string::size_type start_pos; |
| 77 switch (type_) { | 76 switch (type_) { |
| 78 case TRACE_TYPE_BOOL: | 77 case TRACE_TYPE_BOOL: |
| 79 *out += as_bool() ? "true" : "false"; | 78 *out += as_bool() ? "true" : "false"; |
| 80 break; | 79 break; |
| 81 case TRACE_TYPE_UINT: | 80 case TRACE_TYPE_UINT: |
| 82 base::snprintf(temp_string, arraysize(temp_string), "%llu", | 81 StringAppendF(out, "%llu", static_cast<unsigned long long>(as_uint())); |
|
jbates
2011/11/17 01:15:28
Cleanup to match other instances of StringAppendF
| |
| 83 static_cast<unsigned long long>(as_uint())); | |
| 84 *out += temp_string; | |
| 85 break; | 82 break; |
| 86 case TRACE_TYPE_INT: | 83 case TRACE_TYPE_INT: |
| 87 base::snprintf(temp_string, arraysize(temp_string), "%lld", | 84 StringAppendF(out, "%lld", static_cast<long long>(as_int())); |
| 88 static_cast<long long>(as_int())); | |
| 89 *out += temp_string; | |
| 90 break; | 85 break; |
| 91 case TRACE_TYPE_DOUBLE: | 86 case TRACE_TYPE_DOUBLE: |
| 92 base::snprintf(temp_string, arraysize(temp_string), "%f", as_double()); | 87 StringAppendF(out, "%f", as_double()); |
| 93 *out += temp_string; | |
| 94 break; | 88 break; |
| 95 case TRACE_TYPE_POINTER: | 89 case TRACE_TYPE_POINTER: |
| 96 base::snprintf(temp_string, arraysize(temp_string), "%llu", | 90 // JSON only supports double and int numbers. |
| 97 static_cast<unsigned long long>( | 91 // So as not to lose bits from a 64-bit pointer, output as a hex string. |
| 98 reinterpret_cast<intptr_t>( | 92 StringAppendF(out, "\"%llx\"", static_cast<unsigned long long>( |
|
jbates
2011/11/17 01:15:28
Storing the pointer as a string instead of an int,
| |
| 99 as_pointer()))); | 93 reinterpret_cast<intptr_t>( |
| 100 *out += temp_string; | 94 as_pointer()))); |
| 101 break; | 95 break; |
| 102 case TRACE_TYPE_STRING: | 96 case TRACE_TYPE_STRING: |
| 103 case TRACE_TYPE_STATIC_STRING: | 97 case TRACE_TYPE_STATIC_STRING: |
| 104 *out += "\""; | 98 *out += "\""; |
| 105 start_pos = out->size(); | 99 start_pos = out->size(); |
| 106 *out += as_string() ? as_string() : "NULL"; | 100 *out += as_string() ? as_string() : "NULL"; |
| 107 // insert backslash before special characters for proper json format. | 101 // insert backslash before special characters for proper json format. |
| 108 while ((start_pos = out->find_first_of("\\\"", start_pos)) != | 102 while ((start_pos = out->find_first_of("\\\"", start_pos)) != |
| 109 std::string::npos) { | 103 std::string::npos) { |
| 110 out->insert(start_pos, 1, '\\'); | 104 out->insert(start_pos, 1, '\\'); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 138 size_t written = strlcpy(*buffer, *member, end - *buffer) + 1; | 132 size_t written = strlcpy(*buffer, *member, end - *buffer) + 1; |
| 139 DCHECK_LE(static_cast<int>(written), end - *buffer); | 133 DCHECK_LE(static_cast<int>(written), end - *buffer); |
| 140 *member = *buffer; | 134 *member = *buffer; |
| 141 *buffer += written; | 135 *buffer += written; |
| 142 } | 136 } |
| 143 } | 137 } |
| 144 | 138 |
| 145 } // namespace | 139 } // namespace |
| 146 | 140 |
| 147 TraceEvent::TraceEvent() | 141 TraceEvent::TraceEvent() |
| 148 : process_id_(0), | 142 : extra_(0u), |
| 143 category_(NULL), | |
| 144 name_(NULL), | |
| 149 thread_id_(0), | 145 thread_id_(0), |
| 150 phase_(TRACE_EVENT_PHASE_BEGIN), | 146 phase_(TRACE_EVENT_PHASE_BEGIN) { |
| 151 category_(NULL), | |
| 152 name_(NULL) { | |
| 153 arg_names_[0] = NULL; | 147 arg_names_[0] = NULL; |
| 154 arg_names_[1] = NULL; | 148 arg_names_[1] = NULL; |
| 155 } | 149 } |
| 156 | 150 |
| 157 TraceEvent::TraceEvent(unsigned long process_id, | 151 TraceEvent::TraceEvent(int thread_id, |
| 158 unsigned long thread_id, | |
| 159 TimeTicks timestamp, | 152 TimeTicks timestamp, |
| 160 TraceEventPhase phase, | 153 TraceEventPhase phase, |
| 161 const TraceCategory* category, | 154 const TraceCategory* category, |
| 162 const char* name, | 155 const char* name, |
| 156 uint64 extra, | |
| 163 const char* arg1_name, const TraceValue& arg1_val, | 157 const char* arg1_name, const TraceValue& arg1_val, |
| 164 const char* arg2_name, const TraceValue& arg2_val, | 158 const char* arg2_name, const TraceValue& arg2_val, |
| 165 bool copy) | 159 bool copy) |
| 166 : process_id_(process_id), | 160 : timestamp_(timestamp), |
| 161 extra_(extra), | |
| 162 category_(category), | |
| 163 name_(name), | |
| 167 thread_id_(thread_id), | 164 thread_id_(thread_id), |
| 168 timestamp_(timestamp), | 165 phase_(phase) { |
| 169 phase_(phase), | |
| 170 category_(category), | |
| 171 name_(name) { | |
| 172 COMPILE_ASSERT(kTraceMaxNumArgs == 2, TraceEvent_arg_count_out_of_sync); | 166 COMPILE_ASSERT(kTraceMaxNumArgs == 2, TraceEvent_arg_count_out_of_sync); |
| 173 arg_names_[0] = arg1_name; | 167 arg_names_[0] = arg1_name; |
| 174 arg_names_[1] = arg2_name; | 168 arg_names_[1] = arg2_name; |
| 175 arg_values_[0] = arg1_val; | 169 arg_values_[0] = arg1_val; |
| 176 arg_values_[1] = arg2_val; | 170 arg_values_[1] = arg2_val; |
| 177 | 171 |
| 178 size_t alloc_size = 0; | 172 size_t alloc_size = 0; |
| 179 if (copy) { | 173 if (copy) { |
| 180 alloc_size += GetAllocLength(name); | 174 alloc_size += GetAllocLength(name); |
| 181 alloc_size += GetAllocLength(arg1_name); | 175 alloc_size += GetAllocLength(arg1_name); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 210 } | 204 } |
| 211 } | 205 } |
| 212 | 206 |
| 213 TraceEvent::~TraceEvent() { | 207 TraceEvent::~TraceEvent() { |
| 214 } | 208 } |
| 215 | 209 |
| 216 const char* TraceEvent::GetPhaseString(TraceEventPhase phase) { | 210 const char* TraceEvent::GetPhaseString(TraceEventPhase phase) { |
| 217 switch(phase) { | 211 switch(phase) { |
| 218 case TRACE_EVENT_PHASE_BEGIN: | 212 case TRACE_EVENT_PHASE_BEGIN: |
| 219 return "B"; | 213 return "B"; |
| 214 case TRACE_EVENT_PHASE_END: | |
|
jbates
2011/11/17 01:15:28
Reordered these to match the order in the enum.
| |
| 215 return "E"; | |
| 220 case TRACE_EVENT_PHASE_INSTANT: | 216 case TRACE_EVENT_PHASE_INSTANT: |
| 221 return "I"; | 217 return "I"; |
| 222 case TRACE_EVENT_PHASE_END: | 218 case TRACE_EVENT_PHASE_START: |
| 223 return "E"; | 219 return "S"; |
| 220 case TRACE_EVENT_PHASE_FINISH: | |
| 221 return "F"; | |
| 224 case TRACE_EVENT_PHASE_METADATA: | 222 case TRACE_EVENT_PHASE_METADATA: |
| 225 return "M"; | 223 return "M"; |
| 226 default: | 224 default: |
| 227 NOTREACHED() << "Invalid phase argument"; | 225 NOTREACHED() << "Invalid phase argument"; |
| 228 return "?"; | 226 return "?"; |
| 229 } | 227 } |
| 230 } | 228 } |
| 231 | 229 |
| 232 TraceEventPhase TraceEvent::GetPhase(const char* phase) { | 230 TraceEventPhase TraceEvent::GetPhase(const char* phase) { |
| 233 switch(*phase) { | 231 switch(*phase) { |
| 234 case 'B': | 232 case 'B': |
| 235 return TRACE_EVENT_PHASE_BEGIN; | 233 return TRACE_EVENT_PHASE_BEGIN; |
| 234 case 'E': | |
| 235 return TRACE_EVENT_PHASE_END; | |
| 236 case 'I': | 236 case 'I': |
| 237 return TRACE_EVENT_PHASE_INSTANT; | 237 return TRACE_EVENT_PHASE_INSTANT; |
| 238 case 'E': | 238 case 'S': |
| 239 return TRACE_EVENT_PHASE_END; | 239 return TRACE_EVENT_PHASE_START; |
| 240 case 'F': | |
| 241 return TRACE_EVENT_PHASE_FINISH; | |
| 240 case 'M': | 242 case 'M': |
| 241 return TRACE_EVENT_PHASE_METADATA; | 243 return TRACE_EVENT_PHASE_METADATA; |
| 242 default: | 244 default: |
| 243 NOTREACHED() << "Invalid phase name"; | 245 NOTREACHED() << "Invalid phase name"; |
| 244 return TRACE_EVENT_PHASE_METADATA; | 246 return TRACE_EVENT_PHASE_METADATA; |
| 245 } | 247 } |
| 246 } | 248 } |
| 247 | 249 |
| 248 void TraceEvent::AppendEventsAsJSON(const std::vector<TraceEvent>& events, | 250 void TraceEvent::AppendEventsAsJSON(const std::vector<TraceEvent>& events, |
| 249 size_t start, | 251 size_t start, |
| 250 size_t count, | 252 size_t count, |
| 251 std::string* out) { | 253 std::string* out) { |
| 252 for (size_t i = 0; i < count && start + i < events.size(); ++i) { | 254 for (size_t i = 0; i < count && start + i < events.size(); ++i) { |
| 253 if (i > 0) | 255 if (i > 0) |
| 254 *out += ","; | 256 *out += ","; |
| 255 events[i + start].AppendAsJSON(out); | 257 events[i + start].AppendAsJSON(out); |
| 256 } | 258 } |
| 257 } | 259 } |
| 258 | 260 |
| 259 void TraceEvent::AppendAsJSON(std::string* out) const { | 261 void TraceEvent::AppendAsJSON(std::string* out) const { |
| 260 const char* phase_str = GetPhaseString(phase_); | 262 const char* phase_str = GetPhaseString(phase_); |
| 261 int64 time_int64 = timestamp_.ToInternalValue(); | 263 int64 time_int64 = timestamp_.ToInternalValue(); |
| 264 int process_id = static_cast<int>(base::GetCurrentProcId()); | |
| 262 // Category name checked at category creation time. | 265 // Category name checked at category creation time. |
| 263 DCHECK(!strchr(name_, '"')); | 266 DCHECK(!strchr(name_, '"')); |
| 264 StringAppendF(out, | 267 StringAppendF(out, |
| 265 "{\"cat\":\"%s\",\"pid\":%i,\"tid\":%i,\"ts\":%lld," | 268 "{\"cat\":\"%s\",\"pid\":%i,\"tid\":%i,\"ts\":%lld," |
| 266 "\"ph\":\"%s\",\"name\":\"%s\",\"args\":{", | 269 "\"ph\":\"%s\",\"name\":\"%s\",\"args\":{", |
| 267 category_->name, | 270 category_->name, |
| 268 static_cast<int>(process_id_), | 271 process_id, |
| 269 static_cast<int>(thread_id_), | 272 thread_id_, |
| 270 static_cast<long long>(time_int64), | 273 static_cast<long long>(time_int64), |
| 271 phase_str, | 274 phase_str, |
| 272 name_); | 275 name_); |
| 273 | 276 |
| 274 // Output argument names and values, stop at first NULL argument name. | 277 // Output argument names and values, stop at first NULL argument name. |
| 275 for (size_t i = 0; i < kTraceMaxNumArgs && arg_names_[i]; ++i) { | 278 for (size_t i = 0; i < kTraceMaxNumArgs && arg_names_[i]; ++i) { |
| 276 if (i > 0) | 279 if (i > 0) |
| 277 *out += ","; | 280 *out += ","; |
| 278 *out += "\""; | 281 *out += "\""; |
| 279 *out += arg_names_[i]; | 282 *out += arg_names_[i]; |
| 280 *out += "\":"; | 283 *out += "\":"; |
| 281 arg_values_[i].AppendAsJSON(out); | 284 arg_values_[i].AppendAsJSON(out); |
| 282 } | 285 } |
| 283 *out += "}}"; | 286 *out += "}"; |
| 287 | |
| 288 // If extra_ is non-zero, print it out as a hex string so we don't loose any | |
| 289 // bits (it might be a 64-bit pointer). | |
| 290 if (extra_ != 0ull) | |
| 291 StringAppendF(out, ",\"ext\":\"%llx\"", | |
| 292 static_cast<unsigned long long>(extra_)); | |
| 293 *out += "}"; | |
| 284 } | 294 } |
| 285 | 295 |
| 286 //////////////////////////////////////////////////////////////////////////////// | 296 //////////////////////////////////////////////////////////////////////////////// |
| 287 // | 297 // |
| 288 // TraceResultBuffer | 298 // TraceResultBuffer |
| 289 // | 299 // |
| 290 //////////////////////////////////////////////////////////////////////////////// | 300 //////////////////////////////////////////////////////////////////////////////// |
| 291 | 301 |
| 292 TraceResultBuffer::OutputCallback | 302 TraceResultBuffer::OutputCallback |
| 293 TraceResultBuffer::SimpleOutput::GetCallback() { | 303 TraceResultBuffer::SimpleOutput::GetCallback() { |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 522 i, | 532 i, |
| 523 kTraceEventBatchSize, | 533 kTraceEventBatchSize, |
| 524 &(json_events_str_ptr->data)); | 534 &(json_events_str_ptr->data)); |
| 525 output_callback_copy.Run(json_events_str_ptr); | 535 output_callback_copy.Run(json_events_str_ptr); |
| 526 } | 536 } |
| 527 } | 537 } |
| 528 | 538 |
| 529 int TraceLog::AddTraceEvent(TraceEventPhase phase, | 539 int TraceLog::AddTraceEvent(TraceEventPhase phase, |
| 530 const TraceCategory* category, | 540 const TraceCategory* category, |
| 531 const char* name, | 541 const char* name, |
| 542 uint64 extra, | |
| 532 const char* arg1_name, TraceValue arg1_val, | 543 const char* arg1_name, TraceValue arg1_val, |
| 533 const char* arg2_name, TraceValue arg2_val, | 544 const char* arg2_name, TraceValue arg2_val, |
| 534 int threshold_begin_id, | 545 int threshold_begin_id, |
| 535 int64 threshold, | 546 int64 threshold, |
| 536 EventFlags flags) { | 547 EventFlags flags) { |
| 537 DCHECK(name); | 548 DCHECK(name); |
| 538 TimeTicks now = TimeTicks::HighResNow(); | 549 TimeTicks now = TimeTicks::HighResNow(); |
| 539 BufferFullCallback buffer_full_callback_copy; | 550 BufferFullCallback buffer_full_callback_copy; |
| 540 int ret_begin_id = -1; | 551 int ret_begin_id = -1; |
| 541 { | 552 { |
| 542 AutoLock lock(lock_); | 553 AutoLock lock(lock_); |
| 543 if (!category->enabled) | 554 if (!category->enabled) |
| 544 return -1; | 555 return -1; |
| 545 if (logged_events_.size() >= kTraceEventBufferSize) | 556 if (logged_events_.size() >= kTraceEventBufferSize) |
| 546 return -1; | 557 return -1; |
| 547 | 558 |
| 548 PlatformThreadId thread_id = PlatformThread::CurrentId(); | 559 int thread_id = static_cast<int>(PlatformThread::CurrentId()); |
| 549 | 560 |
| 550 const char* new_name = PlatformThread::GetName(); | 561 const char* new_name = PlatformThread::GetName(); |
| 551 // Check if the thread name has been set or changed since the previous | 562 // Check if the thread name has been set or changed since the previous |
| 552 // call (if any), but don't bother if the new name is empty. Note this will | 563 // call (if any), but don't bother if the new name is empty. Note this will |
| 553 // not detect a thread name change within the same char* buffer address: we | 564 // not detect a thread name change within the same char* buffer address: we |
| 554 // favor common case performance over corner case correctness. | 565 // favor common case performance over corner case correctness. |
| 555 if (new_name != g_current_thread_name.Get().Get() && | 566 if (new_name != g_current_thread_name.Get().Get() && |
| 556 new_name && *new_name) { | 567 new_name && *new_name) { |
| 557 // Benign const cast. | 568 // Benign const cast. |
| 558 g_current_thread_name.Get().Set(const_cast<char*>(new_name)); | 569 g_current_thread_name.Get().Set(const_cast<char*>(new_name)); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 587 if (elapsed < TimeDelta::FromMicroseconds(threshold)) { | 598 if (elapsed < TimeDelta::FromMicroseconds(threshold)) { |
| 588 // Remove begin event and do not add end event. | 599 // Remove begin event and do not add end event. |
| 589 // This will be expensive if there have been other events in the | 600 // This will be expensive if there have been other events in the |
| 590 // mean time (should be rare). | 601 // mean time (should be rare). |
| 591 logged_events_.erase(logged_events_.begin() + begin_i); | 602 logged_events_.erase(logged_events_.begin() + begin_i); |
| 592 return -1; | 603 return -1; |
| 593 } | 604 } |
| 594 } | 605 } |
| 595 ret_begin_id = static_cast<int>(logged_events_.size()); | 606 ret_begin_id = static_cast<int>(logged_events_.size()); |
| 596 logged_events_.push_back( | 607 logged_events_.push_back( |
| 597 TraceEvent(static_cast<unsigned long>(base::GetCurrentProcId()), | 608 TraceEvent(thread_id, |
| 598 thread_id, | 609 now, phase, category, name, extra, |
| 599 now, phase, category, name, | |
| 600 arg1_name, arg1_val, | 610 arg1_name, arg1_val, |
| 601 arg2_name, arg2_val, | 611 arg2_name, arg2_val, |
| 602 flags & EVENT_FLAG_COPY)); | 612 flags & EVENT_FLAG_COPY)); |
| 603 | 613 |
| 604 if (logged_events_.size() == kTraceEventBufferSize) { | 614 if (logged_events_.size() == kTraceEventBufferSize) { |
| 605 buffer_full_callback_copy = buffer_full_callback_; | 615 buffer_full_callback_copy = buffer_full_callback_; |
| 606 } | 616 } |
| 607 } // release lock | 617 } // release lock |
| 608 | 618 |
| 609 if (!buffer_full_callback_copy.is_null()) | 619 if (!buffer_full_callback_copy.is_null()) |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 638 } | 648 } |
| 639 | 649 |
| 640 void TraceLog::AddCurrentMetadataEvents() { | 650 void TraceLog::AddCurrentMetadataEvents() { |
| 641 lock_.AssertAcquired(); | 651 lock_.AssertAcquired(); |
| 642 for(base::hash_map<PlatformThreadId, std::string>::iterator it = | 652 for(base::hash_map<PlatformThreadId, std::string>::iterator it = |
| 643 thread_names_.begin(); | 653 thread_names_.begin(); |
| 644 it != thread_names_.end(); | 654 it != thread_names_.end(); |
| 645 it++) { | 655 it++) { |
| 646 if (!it->second.empty()) | 656 if (!it->second.empty()) |
| 647 logged_events_.push_back( | 657 logged_events_.push_back( |
| 648 TraceEvent(static_cast<unsigned long>(base::GetCurrentProcId()), | 658 TraceEvent(it->first, |
| 649 it->first, | |
| 650 TimeTicks(), base::debug::TRACE_EVENT_PHASE_METADATA, | 659 TimeTicks(), base::debug::TRACE_EVENT_PHASE_METADATA, |
| 651 g_category_metadata, "thread_name", | 660 g_category_metadata, "thread_name", 0, |
| 652 "name", it->second, | 661 "name", it->second, |
| 653 NULL, 0, | 662 NULL, 0, |
| 654 false)); | 663 false)); |
| 655 } | 664 } |
| 656 } | 665 } |
| 657 | 666 |
| 658 void TraceLog::DeleteForTesting() { | 667 void TraceLog::DeleteForTesting() { |
| 659 DeleteTraceLogForTesting::Delete(); | 668 DeleteTraceLogForTesting::Delete(); |
| 660 } | 669 } |
| 661 | 670 |
| 662 void TraceLog::Resurrect() { | 671 void TraceLog::Resurrect() { |
| 663 StaticMemorySingletonTraits<TraceLog>::Resurrect(); | 672 StaticMemorySingletonTraits<TraceLog>::Resurrect(); |
| 664 } | 673 } |
| 665 | 674 |
| 666 namespace internal { | 675 namespace internal { |
| 667 | 676 |
| 668 void TraceEndOnScopeClose::Initialize(const TraceCategory* category, | 677 void TraceEndOnScopeClose::Initialize(const TraceCategory* category, |
| 669 const char* name) { | 678 const char* name) { |
| 670 data_.category = category; | 679 data_.category = category; |
| 671 data_.name = name; | 680 data_.name = name; |
| 672 p_data_ = &data_; | 681 p_data_ = &data_; |
| 673 } | 682 } |
| 674 | 683 |
| 675 void TraceEndOnScopeClose::AddEventIfEnabled() { | 684 void TraceEndOnScopeClose::AddEventIfEnabled() { |
| 676 // Only called when p_data_ is non-null. | 685 // Only called when p_data_ is non-null. |
| 677 if (p_data_->category->enabled) { | 686 if (p_data_->category->enabled) { |
| 678 base::debug::TraceLog::GetInstance()->AddTraceEvent( | 687 base::debug::TraceLog::GetInstance()->AddTraceEvent( |
| 679 base::debug::TRACE_EVENT_PHASE_END, | 688 base::debug::TRACE_EVENT_PHASE_END, |
| 680 p_data_->category, | 689 p_data_->category, |
| 681 p_data_->name, | 690 p_data_->name, 0, |
| 682 NULL, 0, NULL, 0, | 691 NULL, 0, NULL, 0, |
| 683 -1, 0, TraceLog::EVENT_FLAG_NONE); | 692 -1, 0, TraceLog::EVENT_FLAG_NONE); |
| 684 } | 693 } |
| 685 } | 694 } |
| 686 | 695 |
| 687 void TraceEndOnScopeCloseThreshold::Initialize(const TraceCategory* category, | 696 void TraceEndOnScopeCloseThreshold::Initialize(const TraceCategory* category, |
| 688 const char* name, | 697 const char* name, |
| 689 int threshold_begin_id, | 698 int threshold_begin_id, |
| 690 int64 threshold) { | 699 int64 threshold) { |
| 691 data_.category = category; | 700 data_.category = category; |
| 692 data_.name = name; | 701 data_.name = name; |
| 693 data_.threshold_begin_id = threshold_begin_id; | 702 data_.threshold_begin_id = threshold_begin_id; |
| 694 data_.threshold = threshold; | 703 data_.threshold = threshold; |
| 695 p_data_ = &data_; | 704 p_data_ = &data_; |
| 696 } | 705 } |
| 697 | 706 |
| 698 void TraceEndOnScopeCloseThreshold::AddEventIfEnabled() { | 707 void TraceEndOnScopeCloseThreshold::AddEventIfEnabled() { |
| 699 // Only called when p_data_ is non-null. | 708 // Only called when p_data_ is non-null. |
| 700 if (p_data_->category->enabled) { | 709 if (p_data_->category->enabled) { |
| 701 base::debug::TraceLog::GetInstance()->AddTraceEvent( | 710 base::debug::TraceLog::GetInstance()->AddTraceEvent( |
| 702 base::debug::TRACE_EVENT_PHASE_END, | 711 base::debug::TRACE_EVENT_PHASE_END, |
| 703 p_data_->category, | 712 p_data_->category, |
| 704 p_data_->name, | 713 p_data_->name, 0, |
| 705 NULL, 0, NULL, 0, | 714 NULL, 0, NULL, 0, |
| 706 p_data_->threshold_begin_id, p_data_->threshold, | 715 p_data_->threshold_begin_id, p_data_->threshold, |
| 707 TraceLog::EVENT_FLAG_NONE); | 716 TraceLog::EVENT_FLAG_NONE); |
| 708 } | 717 } |
| 709 } | 718 } |
| 710 | 719 |
| 711 } // namespace internal | 720 } // namespace internal |
| 712 | 721 |
| 713 } // namespace debug | 722 } // namespace debug |
| 714 } // namespace base | 723 } // namespace base |
| OLD | NEW |