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 18 matching lines...) Expand all Loading... |
29 #include "base/time/time.h" | 29 #include "base/time/time.h" |
30 | 30 |
31 #if defined(OS_WIN) | 31 #if defined(OS_WIN) |
32 #include "base/debug/trace_event_win.h" | 32 #include "base/debug/trace_event_win.h" |
33 #endif | 33 #endif |
34 | 34 |
35 class DeleteTraceLogForTesting { | 35 class DeleteTraceLogForTesting { |
36 public: | 36 public: |
37 static void Delete() { | 37 static void Delete() { |
38 Singleton<base::debug::TraceLog, | 38 Singleton<base::debug::TraceLog, |
39 StaticMemorySingletonTraits<base::debug::TraceLog> >::OnExit(0); | 39 LeakySingletonTraits<base::debug::TraceLog> >::OnExit(0); |
40 } | 40 } |
41 }; | 41 }; |
42 | 42 |
43 // Not supported in split-dll build. http://crbug.com/237249 | 43 // Not supported in split-dll build. http://crbug.com/237249 |
44 #if !defined(CHROME_SPLIT_DLL) | 44 #if !defined(CHROME_SPLIT_DLL) |
45 // The thread buckets for the sampling profiler. | 45 // The thread buckets for the sampling profiler. |
46 BASE_EXPORT TRACE_EVENT_API_ATOMIC_WORD g_trace_state[3]; | 46 BASE_EXPORT TRACE_EVENT_API_ATOMIC_WORD g_trace_state[3]; |
47 #endif | 47 #endif |
48 | 48 |
49 namespace base { | 49 namespace base { |
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
736 notification_ |= notification; | 736 notification_ |= notification; |
737 } | 737 } |
738 | 738 |
739 void TraceLog::NotificationHelper::SendNotificationIfAny() { | 739 void TraceLog::NotificationHelper::SendNotificationIfAny() { |
740 if (notification_) | 740 if (notification_) |
741 callback_copy_.Run(notification_); | 741 callback_copy_.Run(notification_); |
742 } | 742 } |
743 | 743 |
744 // static | 744 // static |
745 TraceLog* TraceLog::GetInstance() { | 745 TraceLog* TraceLog::GetInstance() { |
746 return Singleton<TraceLog, StaticMemorySingletonTraits<TraceLog> >::get(); | 746 return Singleton<TraceLog, LeakySingletonTraits<TraceLog> >::get(); |
747 } | 747 } |
748 | 748 |
749 // static | 749 // static |
750 // Note, if you add more options here you also need to update: | 750 // Note, if you add more options here you also need to update: |
751 // content/browser/devtools/devtools_tracing_handler:TraceOptionsFromString | 751 // content/browser/devtools/devtools_tracing_handler:TraceOptionsFromString |
752 TraceLog::Options TraceLog::TraceOptionsFromString(const std::string& options) { | 752 TraceLog::Options TraceLog::TraceOptionsFromString(const std::string& options) { |
753 std::vector<std::string> split; | 753 std::vector<std::string> split; |
754 base::SplitString(options, ',', &split); | 754 base::SplitString(options, ',', &split); |
755 int ret = 0; | 755 int ret = 0; |
756 for (std::vector<std::string>::iterator iter = split.begin(); | 756 for (std::vector<std::string>::iterator iter = split.begin(); |
(...skipping 11 matching lines...) Expand all Loading... |
768 } | 768 } |
769 if (!(ret & RECORD_UNTIL_FULL) && !(ret & RECORD_CONTINUOUSLY)) | 769 if (!(ret & RECORD_UNTIL_FULL) && !(ret & RECORD_CONTINUOUSLY)) |
770 ret |= RECORD_UNTIL_FULL; // Default when no options are specified. | 770 ret |= RECORD_UNTIL_FULL; // Default when no options are specified. |
771 | 771 |
772 return static_cast<Options>(ret); | 772 return static_cast<Options>(ret); |
773 } | 773 } |
774 | 774 |
775 TraceLog::TraceLog() | 775 TraceLog::TraceLog() |
776 : enable_count_(0), | 776 : enable_count_(0), |
777 num_traces_recorded_(0), | 777 num_traces_recorded_(0), |
| 778 event_callback_(NULL), |
778 dispatching_to_observer_list_(false), | 779 dispatching_to_observer_list_(false), |
779 watch_category_(NULL), | 780 watch_category_(NULL), |
780 trace_options_(RECORD_UNTIL_FULL), | 781 trace_options_(RECORD_UNTIL_FULL), |
781 sampling_thread_handle_(0), | 782 sampling_thread_handle_(0), |
782 category_filter_(CategoryFilter::kDefaultCategoryFilterString) { | 783 category_filter_(CategoryFilter::kDefaultCategoryFilterString) { |
783 // Trace is enabled or disabled on one thread while other threads are | 784 // Trace is enabled or disabled on one thread while other threads are |
784 // accessing the enabled flag. We don't care whether edge-case events are | 785 // accessing the enabled flag. We don't care whether edge-case events are |
785 // traced or not, so we allow races on the enabled flag to keep the trace | 786 // traced or not, so we allow races on the enabled flag to keep the trace |
786 // macros fast. | 787 // macros fast. |
787 // TODO(jbates): ANNOTATE_BENIGN_RACE_SIZED crashes windows TSAN bots: | 788 // TODO(jbates): ANNOTATE_BENIGN_RACE_SIZED crashes windows TSAN bots: |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1318 | 1319 |
1319 void TraceLog::InstallWaitableEventForSamplingTesting( | 1320 void TraceLog::InstallWaitableEventForSamplingTesting( |
1320 WaitableEvent* waitable_event) { | 1321 WaitableEvent* waitable_event) { |
1321 sampling_thread_->InstallWaitableEventForSamplingTesting(waitable_event); | 1322 sampling_thread_->InstallWaitableEventForSamplingTesting(waitable_event); |
1322 } | 1323 } |
1323 | 1324 |
1324 void TraceLog::DeleteForTesting() { | 1325 void TraceLog::DeleteForTesting() { |
1325 DeleteTraceLogForTesting::Delete(); | 1326 DeleteTraceLogForTesting::Delete(); |
1326 } | 1327 } |
1327 | 1328 |
1328 void TraceLog::Resurrect() { | |
1329 StaticMemorySingletonTraits<TraceLog>::Resurrect(); | |
1330 } | |
1331 | |
1332 void TraceLog::SetProcessID(int process_id) { | 1329 void TraceLog::SetProcessID(int process_id) { |
1333 process_id_ = process_id; | 1330 process_id_ = process_id; |
1334 // Create a FNV hash from the process ID for XORing. | 1331 // Create a FNV hash from the process ID for XORing. |
1335 // See http://isthe.com/chongo/tech/comp/fnv/ for algorithm details. | 1332 // See http://isthe.com/chongo/tech/comp/fnv/ for algorithm details. |
1336 unsigned long long offset_basis = 14695981039346656037ull; | 1333 unsigned long long offset_basis = 14695981039346656037ull; |
1337 unsigned long long fnv_prime = 1099511628211ull; | 1334 unsigned long long fnv_prime = 1099511628211ull; |
1338 unsigned long long pid = static_cast<unsigned long long>(process_id_); | 1335 unsigned long long pid = static_cast<unsigned long long>(process_id_); |
1339 process_id_hash_ = (offset_basis ^ pid) * fnv_prime; | 1336 process_id_hash_ = (offset_basis ^ pid) * fnv_prime; |
1340 } | 1337 } |
1341 | 1338 |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1547 0, // num_args | 1544 0, // num_args |
1548 NULL, // arg_names | 1545 NULL, // arg_names |
1549 NULL, // arg_types | 1546 NULL, // arg_types |
1550 NULL, // arg_values | 1547 NULL, // arg_values |
1551 NULL, // convertable values | 1548 NULL, // convertable values |
1552 TRACE_EVENT_FLAG_NONE); // flags | 1549 TRACE_EVENT_FLAG_NONE); // flags |
1553 } | 1550 } |
1554 } | 1551 } |
1555 | 1552 |
1556 } // namespace trace_event_internal | 1553 } // namespace trace_event_internal |
OLD | NEW |