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