OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_impl.h" | 5 #include "base/debug/trace_event_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/debug/leak_annotations.h" | 10 #include "base/debug/leak_annotations.h" |
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 scoped_refptr<RefCountedString> json_events_str_ptr = | 602 scoped_refptr<RefCountedString> json_events_str_ptr = |
603 new RefCountedString(); | 603 new RefCountedString(); |
604 TraceEvent::AppendEventsAsJSON(previous_logged_events, | 604 TraceEvent::AppendEventsAsJSON(previous_logged_events, |
605 i, | 605 i, |
606 kTraceEventBatchSize, | 606 kTraceEventBatchSize, |
607 &(json_events_str_ptr->data())); | 607 &(json_events_str_ptr->data())); |
608 cb.Run(json_events_str_ptr); | 608 cb.Run(json_events_str_ptr); |
609 } | 609 } |
610 } | 610 } |
611 | 611 |
612 int TraceLog::AddTraceEvent(char phase, | 612 void TraceLog::AddTraceEvent(char phase, |
613 const unsigned char* category_enabled, | 613 const unsigned char* category_enabled, |
614 const char* name, | 614 const char* name, |
615 unsigned long long id, | 615 unsigned long long id, |
616 int num_args, | 616 int num_args, |
617 const char** arg_names, | 617 const char** arg_names, |
618 const unsigned char* arg_types, | 618 const unsigned char* arg_types, |
619 const unsigned long long* arg_values, | 619 const unsigned long long* arg_values, |
620 int threshold_begin_id, | |
621 long long threshold, | |
622 unsigned char flags) { | 620 unsigned char flags) { |
623 DCHECK(name); | 621 DCHECK(name); |
624 | 622 |
625 #if defined(OS_ANDROID) | 623 #if defined(OS_ANDROID) |
626 SendToATrace(phase, GetCategoryName(category_enabled), name, | 624 SendToATrace(phase, GetCategoryName(category_enabled), name, |
627 num_args, arg_names, arg_types, arg_values); | 625 num_args, arg_names, arg_types, arg_values); |
628 #endif | 626 #endif |
629 | 627 |
630 TimeTicks now = TimeTicks::NowFromSystemTraceTime() - time_offset_; | 628 TimeTicks now = TimeTicks::NowFromSystemTraceTime() - time_offset_; |
631 NotificationHelper notifier(this); | 629 NotificationHelper notifier(this); |
632 int ret_begin_id = -1; | |
633 { | 630 { |
634 AutoLock lock(lock_); | 631 AutoLock lock(lock_); |
635 if (*category_enabled != CATEGORY_ENABLED) | 632 if (*category_enabled != CATEGORY_ENABLED) |
636 return -1; | 633 return; |
637 if (logged_events_.size() >= kTraceEventBufferSize) | 634 if (logged_events_.size() >= kTraceEventBufferSize) |
638 return -1; | 635 return; |
639 | 636 |
640 int thread_id = static_cast<int>(PlatformThread::CurrentId()); | 637 int thread_id = static_cast<int>(PlatformThread::CurrentId()); |
641 | 638 |
642 const char* new_name = PlatformThread::GetName(); | 639 const char* new_name = PlatformThread::GetName(); |
643 // Check if the thread name has been set or changed since the previous | 640 // Check if the thread name has been set or changed since the previous |
644 // call (if any), but don't bother if the new name is empty. Note this will | 641 // call (if any), but don't bother if the new name is empty. Note this will |
645 // not detect a thread name change within the same char* buffer address: we | 642 // not detect a thread name change within the same char* buffer address: we |
646 // favor common case performance over corner case correctness. | 643 // favor common case performance over corner case correctness. |
647 if (new_name != g_current_thread_name.Get().Get() && | 644 if (new_name != g_current_thread_name.Get().Get() && |
648 new_name && *new_name) { | 645 new_name && *new_name) { |
(...skipping 11 matching lines...) Expand all Loading... |
660 bool found = std::find(existing_names.begin(), | 657 bool found = std::find(existing_names.begin(), |
661 existing_names.end(), | 658 existing_names.end(), |
662 new_name) != existing_names.end(); | 659 new_name) != existing_names.end(); |
663 if (!found) { | 660 if (!found) { |
664 existing_name->second.push_back(','); | 661 existing_name->second.push_back(','); |
665 existing_name->second.append(new_name); | 662 existing_name->second.append(new_name); |
666 } | 663 } |
667 } | 664 } |
668 } | 665 } |
669 | 666 |
670 if (threshold_begin_id > -1) { | |
671 DCHECK(phase == TRACE_EVENT_PHASE_END); | |
672 size_t begin_i = static_cast<size_t>(threshold_begin_id); | |
673 // Return now if there has been a flush since the begin event was posted. | |
674 if (begin_i >= logged_events_.size()) | |
675 return -1; | |
676 // Determine whether to drop the begin/end pair. | |
677 TimeDelta elapsed = now - logged_events_[begin_i].timestamp(); | |
678 if (elapsed < TimeDelta::FromMicroseconds(threshold)) { | |
679 // Remove begin event and do not add end event. | |
680 // This will be expensive if there have been other events in the | |
681 // mean time (should be rare). | |
682 logged_events_.erase(logged_events_.begin() + begin_i); | |
683 return -1; | |
684 } | |
685 } | |
686 | |
687 if (flags & TRACE_EVENT_FLAG_MANGLE_ID) | 667 if (flags & TRACE_EVENT_FLAG_MANGLE_ID) |
688 id ^= process_id_hash_; | 668 id ^= process_id_hash_; |
689 | 669 |
690 ret_begin_id = static_cast<int>(logged_events_.size()); | |
691 logged_events_.push_back( | 670 logged_events_.push_back( |
692 TraceEvent(thread_id, | 671 TraceEvent(thread_id, |
693 now, phase, category_enabled, name, id, | 672 now, phase, category_enabled, name, id, |
694 num_args, arg_names, arg_types, arg_values, | 673 num_args, arg_names, arg_types, arg_values, |
695 flags)); | 674 flags)); |
696 | 675 |
697 if (logged_events_.size() == kTraceEventBufferSize) | 676 if (logged_events_.size() == kTraceEventBufferSize) |
698 notifier.AddNotificationWhileLocked(TRACE_BUFFER_FULL); | 677 notifier.AddNotificationWhileLocked(TRACE_BUFFER_FULL); |
699 | 678 |
700 if (watch_category_ == category_enabled && watch_event_name_ == name) | 679 if (watch_category_ == category_enabled && watch_event_name_ == name) |
701 notifier.AddNotificationWhileLocked(EVENT_WATCH_NOTIFICATION); | 680 notifier.AddNotificationWhileLocked(EVENT_WATCH_NOTIFICATION); |
702 } // release lock | 681 } // release lock |
703 | 682 |
704 notifier.SendNotificationIfAny(); | 683 notifier.SendNotificationIfAny(); |
705 | |
706 return ret_begin_id; | |
707 } | 684 } |
708 | 685 |
709 void TraceLog::AddTraceEventEtw(char phase, | 686 void TraceLog::AddTraceEventEtw(char phase, |
710 const char* name, | 687 const char* name, |
711 const void* id, | 688 const void* id, |
712 const char* extra) { | 689 const char* extra) { |
713 #if defined(OS_WIN) | 690 #if defined(OS_WIN) |
714 TraceEventETWProvider::Trace(name, phase, id, extra); | 691 TraceEventETWProvider::Trace(name, phase, id, extra); |
715 #endif | 692 #endif |
716 INTERNAL_TRACE_EVENT_ADD(phase, "ETW Trace Event", name, | 693 INTERNAL_TRACE_EVENT_ADD(phase, "ETW Trace Event", name, |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 unsigned long long pid = static_cast<unsigned long long>(process_id_); | 780 unsigned long long pid = static_cast<unsigned long long>(process_id_); |
804 process_id_hash_ = (offset_basis ^ pid) * fnv_prime; | 781 process_id_hash_ = (offset_basis ^ pid) * fnv_prime; |
805 } | 782 } |
806 | 783 |
807 void TraceLog::SetTimeOffset(TimeDelta offset) { | 784 void TraceLog::SetTimeOffset(TimeDelta offset) { |
808 time_offset_ = offset; | 785 time_offset_ = offset; |
809 } | 786 } |
810 | 787 |
811 } // namespace debug | 788 } // namespace debug |
812 } // namespace base | 789 } // namespace base |
OLD | NEW |