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/trace_event/trace_event_impl.h" | 5 #include "base/trace_event/trace_event_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "base/base_switches.h" | 10 #include "base/base_switches.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 // trace. | 60 // trace. |
61 const int kOverheadReportThresholdInMicroseconds = 50; | 61 const int kOverheadReportThresholdInMicroseconds = 50; |
62 | 62 |
63 // String options that can be used to initialize TraceOptions. | 63 // String options that can be used to initialize TraceOptions. |
64 const char kRecordUntilFull[] = "record-until-full"; | 64 const char kRecordUntilFull[] = "record-until-full"; |
65 const char kRecordContinuously[] = "record-continuously"; | 65 const char kRecordContinuously[] = "record-continuously"; |
66 const char kRecordAsMuchAsPossible[] = "record-as-much-as-possible"; | 66 const char kRecordAsMuchAsPossible[] = "record-as-much-as-possible"; |
67 const char kTraceToConsole[] = "trace-to-console"; | 67 const char kTraceToConsole[] = "trace-to-console"; |
68 const char kEnableSampling[] = "enable-sampling"; | 68 const char kEnableSampling[] = "enable-sampling"; |
69 const char kEnableSystrace[] = "enable-systrace"; | 69 const char kEnableSystrace[] = "enable-systrace"; |
| 70 const char kEnableArgsWhitelist[] = "enable-args-whitelist"; |
70 | 71 |
71 // Controls the number of trace events we will buffer in-memory | 72 // Controls the number of trace events we will buffer in-memory |
72 // before throwing them away. | 73 // before throwing them away. |
73 const size_t kTraceBufferChunkSize = TraceBufferChunk::kTraceBufferChunkSize; | 74 const size_t kTraceBufferChunkSize = TraceBufferChunk::kTraceBufferChunkSize; |
74 const size_t kTraceEventVectorBigBufferChunks = | 75 const size_t kTraceEventVectorBigBufferChunks = |
75 512000000 / kTraceBufferChunkSize; | 76 512000000 / kTraceBufferChunkSize; |
76 const size_t kTraceEventVectorBufferChunks = 256000 / kTraceBufferChunkSize; | 77 const size_t kTraceEventVectorBufferChunks = 256000 / kTraceBufferChunkSize; |
77 const size_t kTraceEventRingBufferChunks = kTraceEventVectorBufferChunks / 4; | 78 const size_t kTraceEventRingBufferChunks = kTraceEventVectorBufferChunks / 4; |
78 const size_t kTraceEventBufferSizeInBytes = 100 * 1024; | 79 const size_t kTraceEventBufferSizeInBytes = 100 * 1024; |
79 // Can store results for 30 seconds with 1 ms sampling interval. | 80 // Can store results for 30 seconds with 1 ms sampling interval. |
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 case TRACE_VALUE_TYPE_STRING: | 688 case TRACE_VALUE_TYPE_STRING: |
688 case TRACE_VALUE_TYPE_COPY_STRING: | 689 case TRACE_VALUE_TYPE_COPY_STRING: |
689 EscapeJSONString(value.as_string ? value.as_string : "NULL", true, out); | 690 EscapeJSONString(value.as_string ? value.as_string : "NULL", true, out); |
690 break; | 691 break; |
691 default: | 692 default: |
692 NOTREACHED() << "Don't know how to print this value"; | 693 NOTREACHED() << "Don't know how to print this value"; |
693 break; | 694 break; |
694 } | 695 } |
695 } | 696 } |
696 | 697 |
697 void TraceEvent::AppendAsJSON(std::string* out) const { | 698 void TraceEvent::AppendAsJSON( |
| 699 std::string* out, |
| 700 const EventFilterPredicate& event_filter_predicate) const { |
698 int64 time_int64 = timestamp_.ToInternalValue(); | 701 int64 time_int64 = timestamp_.ToInternalValue(); |
699 int process_id = TraceLog::GetInstance()->process_id(); | 702 int process_id = TraceLog::GetInstance()->process_id(); |
| 703 const char* category_group_name = |
| 704 TraceLog::GetCategoryGroupName(category_group_enabled_); |
| 705 |
700 // Category group checked at category creation time. | 706 // Category group checked at category creation time. |
701 DCHECK(!strchr(name_, '"')); | 707 DCHECK(!strchr(name_, '"')); |
702 StringAppendF(out, | 708 StringAppendF(out, "{\"pid\":%i,\"tid\":%i,\"ts\":%" PRId64 |
703 "{\"pid\":%i,\"tid\":%i,\"ts\":%" PRId64 "," | 709 "," |
704 "\"ph\":\"%c\",\"cat\":\"%s\",\"name\":\"%s\",\"args\":{", | 710 "\"ph\":\"%c\",\"cat\":\"%s\",\"name\":\"%s\",\"args\":{", |
705 process_id, | 711 process_id, thread_id_, time_int64, phase_, category_group_name, |
706 thread_id_, | 712 name_); |
707 time_int64, | |
708 phase_, | |
709 TraceLog::GetCategoryGroupName(category_group_enabled_), | |
710 name_); | |
711 | 713 |
712 // Output argument names and values, stop at first NULL argument name. | 714 // Output argument names and values, stop at first NULL argument name. |
713 for (int i = 0; i < kTraceMaxNumArgs && arg_names_[i]; ++i) { | 715 if (arg_names_[0]) { |
714 if (i > 0) | 716 bool allow_args = event_filter_predicate.is_null() || |
715 *out += ","; | 717 event_filter_predicate.Run(category_group_name, name_); |
716 *out += "\""; | |
717 *out += arg_names_[i]; | |
718 *out += "\":"; | |
719 | 718 |
720 if (arg_types_[i] == TRACE_VALUE_TYPE_CONVERTABLE) | 719 if (allow_args) { |
721 convertable_values_[i]->AppendAsTraceFormat(out); | 720 for (int i = 0; i < kTraceMaxNumArgs && arg_names_[i]; ++i) { |
722 else | 721 if (i > 0) |
723 AppendValueAsJSON(arg_types_[i], arg_values_[i], out); | 722 *out += ","; |
| 723 *out += "\""; |
| 724 *out += arg_names_[i]; |
| 725 *out += "\":"; |
| 726 |
| 727 if (arg_types_[i] == TRACE_VALUE_TYPE_CONVERTABLE) |
| 728 convertable_values_[i]->AppendAsTraceFormat(out); |
| 729 else |
| 730 AppendValueAsJSON(arg_types_[i], arg_values_[i], out); |
| 731 } |
| 732 } else { |
| 733 *out += "\"stripped\":1"; |
| 734 } |
724 } | 735 } |
| 736 |
725 *out += "}"; | 737 *out += "}"; |
726 | 738 |
727 if (phase_ == TRACE_EVENT_PHASE_COMPLETE) { | 739 if (phase_ == TRACE_EVENT_PHASE_COMPLETE) { |
728 int64 duration = duration_.ToInternalValue(); | 740 int64 duration = duration_.ToInternalValue(); |
729 if (duration != -1) | 741 if (duration != -1) |
730 StringAppendF(out, ",\"dur\":%" PRId64, duration); | 742 StringAppendF(out, ",\"dur\":%" PRId64, duration); |
731 if (!thread_timestamp_.is_null()) { | 743 if (!thread_timestamp_.is_null()) { |
732 int64 thread_duration = thread_duration_.ToInternalValue(); | 744 int64 thread_duration = thread_duration_.ToInternalValue(); |
733 if (thread_duration != -1) | 745 if (thread_duration != -1) |
734 StringAppendF(out, ",\"tdur\":%" PRId64, thread_duration); | 746 StringAppendF(out, ",\"tdur\":%" PRId64, thread_duration); |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
990 } else if (*iter == kRecordContinuously) { | 1002 } else if (*iter == kRecordContinuously) { |
991 record_mode = RECORD_CONTINUOUSLY; | 1003 record_mode = RECORD_CONTINUOUSLY; |
992 } else if (*iter == kTraceToConsole) { | 1004 } else if (*iter == kTraceToConsole) { |
993 record_mode = ECHO_TO_CONSOLE; | 1005 record_mode = ECHO_TO_CONSOLE; |
994 } else if (*iter == kRecordAsMuchAsPossible) { | 1006 } else if (*iter == kRecordAsMuchAsPossible) { |
995 record_mode = RECORD_AS_MUCH_AS_POSSIBLE; | 1007 record_mode = RECORD_AS_MUCH_AS_POSSIBLE; |
996 } else if (*iter == kEnableSampling) { | 1008 } else if (*iter == kEnableSampling) { |
997 enable_sampling = true; | 1009 enable_sampling = true; |
998 } else if (*iter == kEnableSystrace) { | 1010 } else if (*iter == kEnableSystrace) { |
999 enable_systrace = true; | 1011 enable_systrace = true; |
| 1012 } else if (*iter == kEnableArgsWhitelist) { |
| 1013 enable_args_whitelist = true; |
1000 } else { | 1014 } else { |
1001 return false; | 1015 return false; |
1002 } | 1016 } |
1003 } | 1017 } |
1004 return true; | 1018 return true; |
1005 } | 1019 } |
1006 | 1020 |
1007 std::string TraceOptions::ToString() const { | 1021 std::string TraceOptions::ToString() const { |
1008 std::string ret; | 1022 std::string ret; |
1009 switch (record_mode) { | 1023 switch (record_mode) { |
1010 case RECORD_UNTIL_FULL: | 1024 case RECORD_UNTIL_FULL: |
1011 ret = kRecordUntilFull; | 1025 ret = kRecordUntilFull; |
1012 break; | 1026 break; |
1013 case RECORD_CONTINUOUSLY: | 1027 case RECORD_CONTINUOUSLY: |
1014 ret = kRecordContinuously; | 1028 ret = kRecordContinuously; |
1015 break; | 1029 break; |
1016 case ECHO_TO_CONSOLE: | 1030 case ECHO_TO_CONSOLE: |
1017 ret = kTraceToConsole; | 1031 ret = kTraceToConsole; |
1018 break; | 1032 break; |
1019 case RECORD_AS_MUCH_AS_POSSIBLE: | 1033 case RECORD_AS_MUCH_AS_POSSIBLE: |
1020 ret = kRecordAsMuchAsPossible; | 1034 ret = kRecordAsMuchAsPossible; |
1021 break; | 1035 break; |
1022 default: | 1036 default: |
1023 NOTREACHED(); | 1037 NOTREACHED(); |
1024 } | 1038 } |
1025 if (enable_sampling) | 1039 if (enable_sampling) |
1026 ret = ret + "," + kEnableSampling; | 1040 ret = ret + "," + kEnableSampling; |
1027 if (enable_systrace) | 1041 if (enable_systrace) |
1028 ret = ret + "," + kEnableSystrace; | 1042 ret = ret + "," + kEnableSystrace; |
| 1043 if (enable_args_whitelist) |
| 1044 ret = ret + "," + kEnableArgsWhitelist; |
1029 return ret; | 1045 return ret; |
1030 } | 1046 } |
1031 | 1047 |
1032 //////////////////////////////////////////////////////////////////////////////// | 1048 //////////////////////////////////////////////////////////////////////////////// |
1033 // | 1049 // |
1034 // TraceLog | 1050 // TraceLog |
1035 // | 1051 // |
1036 //////////////////////////////////////////////////////////////////////////////// | 1052 //////////////////////////////////////////////////////////////////////////////// |
1037 | 1053 |
1038 class TraceLog::ThreadLocalEventBuffer | 1054 class TraceLog::ThreadLocalEventBuffer |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1473 // Notify observers outside the lock in case they trigger trace events. | 1489 // Notify observers outside the lock in case they trigger trace events. |
1474 for (size_t i = 0; i < observer_list.size(); ++i) | 1490 for (size_t i = 0; i < observer_list.size(); ++i) |
1475 observer_list[i]->OnTraceLogEnabled(); | 1491 observer_list[i]->OnTraceLogEnabled(); |
1476 | 1492 |
1477 { | 1493 { |
1478 AutoLock lock(lock_); | 1494 AutoLock lock(lock_); |
1479 dispatching_to_observer_list_ = false; | 1495 dispatching_to_observer_list_ = false; |
1480 } | 1496 } |
1481 } | 1497 } |
1482 | 1498 |
| 1499 void TraceLog::SetEventFilterPredicate( |
| 1500 const TraceEvent::EventFilterPredicate& event_filter_predicate) { |
| 1501 AutoLock lock(lock_); |
| 1502 event_filter_predicate_ = event_filter_predicate; |
| 1503 } |
| 1504 |
1483 TraceLog::InternalTraceOptions TraceLog::GetInternalOptionsFromTraceOptions( | 1505 TraceLog::InternalTraceOptions TraceLog::GetInternalOptionsFromTraceOptions( |
1484 const TraceOptions& options) { | 1506 const TraceOptions& options) { |
1485 InternalTraceOptions ret = | 1507 InternalTraceOptions ret = |
1486 options.enable_sampling ? kInternalEnableSampling : kInternalNone; | 1508 options.enable_sampling ? kInternalEnableSampling : kInternalNone; |
| 1509 if (options.enable_args_whitelist) |
| 1510 ret |= kInternalEnableArgsWhitelist; |
1487 switch (options.record_mode) { | 1511 switch (options.record_mode) { |
1488 case RECORD_UNTIL_FULL: | 1512 case RECORD_UNTIL_FULL: |
1489 return ret | kInternalRecordUntilFull; | 1513 return ret | kInternalRecordUntilFull; |
1490 case RECORD_CONTINUOUSLY: | 1514 case RECORD_CONTINUOUSLY: |
1491 return ret | kInternalRecordContinuously; | 1515 return ret | kInternalRecordContinuously; |
1492 case ECHO_TO_CONSOLE: | 1516 case ECHO_TO_CONSOLE: |
1493 return ret | kInternalEchoToConsole; | 1517 return ret | kInternalEchoToConsole; |
1494 case RECORD_AS_MUCH_AS_POSSIBLE: | 1518 case RECORD_AS_MUCH_AS_POSSIBLE: |
1495 return ret | kInternalRecordAsMuchAsPossible; | 1519 return ret | kInternalRecordAsMuchAsPossible; |
1496 } | 1520 } |
1497 NOTREACHED(); | 1521 NOTREACHED(); |
1498 return kInternalNone; | 1522 return kInternalNone; |
1499 } | 1523 } |
1500 | 1524 |
1501 CategoryFilter TraceLog::GetCurrentCategoryFilter() { | 1525 CategoryFilter TraceLog::GetCurrentCategoryFilter() { |
1502 AutoLock lock(lock_); | 1526 AutoLock lock(lock_); |
1503 return category_filter_; | 1527 return category_filter_; |
1504 } | 1528 } |
1505 | 1529 |
1506 TraceOptions TraceLog::GetCurrentTraceOptions() const { | 1530 TraceOptions TraceLog::GetCurrentTraceOptions() const { |
1507 TraceOptions ret; | 1531 TraceOptions ret; |
1508 InternalTraceOptions option = trace_options(); | 1532 InternalTraceOptions option = trace_options(); |
1509 ret.enable_sampling = (option & kInternalEnableSampling) != 0; | 1533 ret.enable_sampling = (option & kInternalEnableSampling) != 0; |
| 1534 ret.enable_args_whitelist = (option & kInternalEnableArgsWhitelist) != 0; |
1510 if (option & kInternalRecordUntilFull) | 1535 if (option & kInternalRecordUntilFull) |
1511 ret.record_mode = RECORD_UNTIL_FULL; | 1536 ret.record_mode = RECORD_UNTIL_FULL; |
1512 else if (option & kInternalRecordContinuously) | 1537 else if (option & kInternalRecordContinuously) |
1513 ret.record_mode = RECORD_CONTINUOUSLY; | 1538 ret.record_mode = RECORD_CONTINUOUSLY; |
1514 else if (option & kInternalEchoToConsole) | 1539 else if (option & kInternalEchoToConsole) |
1515 ret.record_mode = ECHO_TO_CONSOLE; | 1540 ret.record_mode = ECHO_TO_CONSOLE; |
1516 else if (option & kInternalRecordAsMuchAsPossible) | 1541 else if (option & kInternalRecordAsMuchAsPossible) |
1517 ret.record_mode = RECORD_AS_MUCH_AS_POSSIBLE; | 1542 ret.record_mode = RECORD_AS_MUCH_AS_POSSIBLE; |
1518 else | 1543 else |
1519 NOTREACHED(); | 1544 NOTREACHED(); |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1741 TimeDelta::FromMilliseconds(kThreadFlushTimeoutMs)); | 1766 TimeDelta::FromMilliseconds(kThreadFlushTimeoutMs)); |
1742 return; | 1767 return; |
1743 } | 1768 } |
1744 | 1769 |
1745 FinishFlush(generation); | 1770 FinishFlush(generation); |
1746 } | 1771 } |
1747 | 1772 |
1748 // Usually it runs on a different thread. | 1773 // Usually it runs on a different thread. |
1749 void TraceLog::ConvertTraceEventsToTraceFormat( | 1774 void TraceLog::ConvertTraceEventsToTraceFormat( |
1750 scoped_ptr<TraceBuffer> logged_events, | 1775 scoped_ptr<TraceBuffer> logged_events, |
1751 const TraceLog::OutputCallback& flush_output_callback) { | 1776 const OutputCallback& flush_output_callback, |
1752 | 1777 const TraceEvent::EventFilterPredicate& event_filter_predicate) { |
1753 if (flush_output_callback.is_null()) | 1778 if (flush_output_callback.is_null()) |
1754 return; | 1779 return; |
1755 | 1780 |
1756 // The callback need to be called at least once even if there is no events | 1781 // The callback need to be called at least once even if there is no events |
1757 // to let the caller know the completion of flush. | 1782 // to let the caller know the completion of flush. |
1758 bool has_more_events = true; | 1783 bool has_more_events = true; |
1759 do { | 1784 do { |
1760 scoped_refptr<RefCountedString> json_events_str_ptr = | 1785 scoped_refptr<RefCountedString> json_events_str_ptr = |
1761 new RefCountedString(); | 1786 new RefCountedString(); |
1762 | 1787 |
1763 while (json_events_str_ptr->size() < kTraceEventBufferSizeInBytes) { | 1788 while (json_events_str_ptr->size() < kTraceEventBufferSizeInBytes) { |
1764 const TraceBufferChunk* chunk = logged_events->NextChunk(); | 1789 const TraceBufferChunk* chunk = logged_events->NextChunk(); |
1765 has_more_events = chunk != NULL; | 1790 has_more_events = chunk != NULL; |
1766 if (!chunk) | 1791 if (!chunk) |
1767 break; | 1792 break; |
1768 for (size_t j = 0; j < chunk->size(); ++j) { | 1793 for (size_t j = 0; j < chunk->size(); ++j) { |
1769 if (json_events_str_ptr->size()) | 1794 if (json_events_str_ptr->size()) |
1770 json_events_str_ptr->data().append(",\n"); | 1795 json_events_str_ptr->data().append(",\n"); |
1771 chunk->GetEventAt(j)->AppendAsJSON(&(json_events_str_ptr->data())); | 1796 chunk->GetEventAt(j)->AppendAsJSON(&(json_events_str_ptr->data()), |
| 1797 event_filter_predicate); |
1772 } | 1798 } |
1773 } | 1799 } |
1774 flush_output_callback.Run(json_events_str_ptr, has_more_events); | 1800 flush_output_callback.Run(json_events_str_ptr, has_more_events); |
1775 } while (has_more_events); | 1801 } while (has_more_events); |
1776 } | 1802 } |
1777 | 1803 |
1778 void TraceLog::FinishFlush(int generation) { | 1804 void TraceLog::FinishFlush(int generation) { |
1779 scoped_ptr<TraceBuffer> previous_logged_events; | 1805 scoped_ptr<TraceBuffer> previous_logged_events; |
1780 OutputCallback flush_output_callback; | 1806 OutputCallback flush_output_callback; |
| 1807 TraceEvent::EventFilterPredicate event_filter_predicate; |
1781 | 1808 |
1782 if (!CheckGeneration(generation)) | 1809 if (!CheckGeneration(generation)) |
1783 return; | 1810 return; |
1784 | 1811 |
1785 { | 1812 { |
1786 AutoLock lock(lock_); | 1813 AutoLock lock(lock_); |
1787 | 1814 |
1788 previous_logged_events.swap(logged_events_); | 1815 previous_logged_events.swap(logged_events_); |
1789 UseNextTraceBuffer(); | 1816 UseNextTraceBuffer(); |
1790 thread_message_loops_.clear(); | 1817 thread_message_loops_.clear(); |
1791 | 1818 |
1792 flush_message_loop_proxy_ = NULL; | 1819 flush_message_loop_proxy_ = NULL; |
1793 flush_output_callback = flush_output_callback_; | 1820 flush_output_callback = flush_output_callback_; |
1794 flush_output_callback_.Reset(); | 1821 flush_output_callback_.Reset(); |
| 1822 |
| 1823 event_filter_predicate = event_filter_predicate_; |
| 1824 event_filter_predicate_.Reset(); |
1795 } | 1825 } |
1796 | 1826 |
1797 if (use_worker_thread_ && | 1827 if (use_worker_thread_ && |
1798 WorkerPool::PostTask( | 1828 WorkerPool::PostTask( |
1799 FROM_HERE, | 1829 FROM_HERE, Bind(&TraceLog::ConvertTraceEventsToTraceFormat, |
1800 Bind(&TraceLog::ConvertTraceEventsToTraceFormat, | 1830 Unretained(this), Passed(&previous_logged_events), |
1801 Passed(&previous_logged_events), | 1831 flush_output_callback, event_filter_predicate), |
1802 flush_output_callback), | |
1803 true)) { | 1832 true)) { |
1804 return; | 1833 return; |
1805 } | 1834 } |
1806 | 1835 |
1807 ConvertTraceEventsToTraceFormat(previous_logged_events.Pass(), | 1836 ConvertTraceEventsToTraceFormat(previous_logged_events.Pass(), |
1808 flush_output_callback); | 1837 flush_output_callback, |
| 1838 event_filter_predicate); |
1809 } | 1839 } |
1810 | 1840 |
1811 // Run in each thread holding a local event buffer. | 1841 // Run in each thread holding a local event buffer. |
1812 void TraceLog::FlushCurrentThread(int generation) { | 1842 void TraceLog::FlushCurrentThread(int generation) { |
1813 { | 1843 { |
1814 AutoLock lock(lock_); | 1844 AutoLock lock(lock_); |
1815 if (!CheckGeneration(generation) || !flush_message_loop_proxy_.get()) { | 1845 if (!CheckGeneration(generation) || !flush_message_loop_proxy_.get()) { |
1816 // This is late. The corresponding flush has finished. | 1846 // This is late. The corresponding flush has finished. |
1817 return; | 1847 return; |
1818 } | 1848 } |
(...skipping 30 matching lines...) Expand all Loading... |
1849 it != thread_message_loops_.end(); ++it) { | 1879 it != thread_message_loops_.end(); ++it) { |
1850 LOG(WARNING) << "Thread: " << (*it)->thread_name(); | 1880 LOG(WARNING) << "Thread: " << (*it)->thread_name(); |
1851 } | 1881 } |
1852 } | 1882 } |
1853 FinishFlush(generation); | 1883 FinishFlush(generation); |
1854 } | 1884 } |
1855 | 1885 |
1856 void TraceLog::FlushButLeaveBufferIntact( | 1886 void TraceLog::FlushButLeaveBufferIntact( |
1857 const TraceLog::OutputCallback& flush_output_callback) { | 1887 const TraceLog::OutputCallback& flush_output_callback) { |
1858 scoped_ptr<TraceBuffer> previous_logged_events; | 1888 scoped_ptr<TraceBuffer> previous_logged_events; |
| 1889 TraceEvent::EventFilterPredicate event_filter_predicate; |
1859 { | 1890 { |
1860 AutoLock lock(lock_); | 1891 AutoLock lock(lock_); |
1861 AddMetadataEventsWhileLocked(); | 1892 AddMetadataEventsWhileLocked(); |
1862 if (thread_shared_chunk_) { | 1893 if (thread_shared_chunk_) { |
1863 // Return the chunk to the main buffer to flush the sampling data. | 1894 // Return the chunk to the main buffer to flush the sampling data. |
1864 logged_events_->ReturnChunk(thread_shared_chunk_index_, | 1895 logged_events_->ReturnChunk(thread_shared_chunk_index_, |
1865 thread_shared_chunk_.Pass()); | 1896 thread_shared_chunk_.Pass()); |
1866 } | 1897 } |
1867 previous_logged_events = logged_events_->CloneForIteration().Pass(); | 1898 previous_logged_events = logged_events_->CloneForIteration().Pass(); |
| 1899 event_filter_predicate = event_filter_predicate_; |
1868 } // release lock | 1900 } // release lock |
1869 | 1901 |
1870 ConvertTraceEventsToTraceFormat(previous_logged_events.Pass(), | 1902 ConvertTraceEventsToTraceFormat(previous_logged_events.Pass(), |
1871 flush_output_callback); | 1903 flush_output_callback, |
| 1904 event_filter_predicate); |
1872 } | 1905 } |
1873 | 1906 |
1874 void TraceLog::UseNextTraceBuffer() { | 1907 void TraceLog::UseNextTraceBuffer() { |
1875 logged_events_.reset(CreateTraceBuffer()); | 1908 logged_events_.reset(CreateTraceBuffer()); |
1876 subtle::NoBarrier_AtomicIncrement(&generation_, 1); | 1909 subtle::NoBarrier_AtomicIncrement(&generation_, 1); |
1877 thread_shared_chunk_.reset(); | 1910 thread_shared_chunk_.reset(); |
1878 thread_shared_chunk_index_ = 0; | 1911 thread_shared_chunk_index_ = 0; |
1879 } | 1912 } |
1880 | 1913 |
1881 TraceEventHandle TraceLog::AddTraceEvent( | 1914 TraceEventHandle TraceLog::AddTraceEvent( |
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2634 } | 2667 } |
2635 | 2668 |
2636 ScopedTraceBinaryEfficient::~ScopedTraceBinaryEfficient() { | 2669 ScopedTraceBinaryEfficient::~ScopedTraceBinaryEfficient() { |
2637 if (*category_group_enabled_) { | 2670 if (*category_group_enabled_) { |
2638 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(category_group_enabled_, | 2671 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(category_group_enabled_, |
2639 name_, event_handle_); | 2672 name_, event_handle_); |
2640 } | 2673 } |
2641 } | 2674 } |
2642 | 2675 |
2643 } // namespace trace_event_internal | 2676 } // namespace trace_event_internal |
OLD | NEW |