Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1063)

Side by Side Diff: base/debug/trace_event_internal.h

Issue 13590005: Add a ConvertableToTraceFormat type to the trace framework. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 // This header file defines the set of trace_event macros without specifying 5 // This header file defines the set of trace_event macros without specifying
6 // how the events actually get collected and stored. If you need to expose trace 6 // how the events actually get collected and stored. If you need to expose trace
7 // events to some other universe, you can copy-and-paste this file as well as 7 // events to some other universe, you can copy-and-paste this file as well as
8 // trace_event.h, modifying the macros contained there as necessary for the 8 // trace_event.h, modifying the macros contained there as necessary for the
9 // target platform. The end result is that multiple libraries can funnel events 9 // target platform. The end result is that multiple libraries can funnel events
10 // through to a shared trace event collector. 10 // through to a shared trace event collector.
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 TRACE_EVENT_FLAG_SCOPE_OFFSET | (TRACE_EVENT_FLAG_SCOPE_OFFSET << 1))) 724 TRACE_EVENT_FLAG_SCOPE_OFFSET | (TRACE_EVENT_FLAG_SCOPE_OFFSET << 1)))
725 725
726 // Type values for identifying types in the TraceValue union. 726 // Type values for identifying types in the TraceValue union.
727 #define TRACE_VALUE_TYPE_BOOL (static_cast<unsigned char>(1)) 727 #define TRACE_VALUE_TYPE_BOOL (static_cast<unsigned char>(1))
728 #define TRACE_VALUE_TYPE_UINT (static_cast<unsigned char>(2)) 728 #define TRACE_VALUE_TYPE_UINT (static_cast<unsigned char>(2))
729 #define TRACE_VALUE_TYPE_INT (static_cast<unsigned char>(3)) 729 #define TRACE_VALUE_TYPE_INT (static_cast<unsigned char>(3))
730 #define TRACE_VALUE_TYPE_DOUBLE (static_cast<unsigned char>(4)) 730 #define TRACE_VALUE_TYPE_DOUBLE (static_cast<unsigned char>(4))
731 #define TRACE_VALUE_TYPE_POINTER (static_cast<unsigned char>(5)) 731 #define TRACE_VALUE_TYPE_POINTER (static_cast<unsigned char>(5))
732 #define TRACE_VALUE_TYPE_STRING (static_cast<unsigned char>(6)) 732 #define TRACE_VALUE_TYPE_STRING (static_cast<unsigned char>(6))
733 #define TRACE_VALUE_TYPE_COPY_STRING (static_cast<unsigned char>(7)) 733 #define TRACE_VALUE_TYPE_COPY_STRING (static_cast<unsigned char>(7))
734 #define TRACE_VALUE_TYPE_CONVERTABLE (static_cast<unsigned char>(8))
734 735
735 // Enum reflecting the scope of an INSTANT event. Must fit within 736 // Enum reflecting the scope of an INSTANT event. Must fit within
736 // TRACE_EVENT_FLAG_SCOPE_MASK. 737 // TRACE_EVENT_FLAG_SCOPE_MASK.
737 #define TRACE_EVENT_SCOPE_GLOBAL (static_cast<unsigned char>(0 << 3)) 738 #define TRACE_EVENT_SCOPE_GLOBAL (static_cast<unsigned char>(0 << 3))
738 #define TRACE_EVENT_SCOPE_PROCESS (static_cast<unsigned char>(1 << 3)) 739 #define TRACE_EVENT_SCOPE_PROCESS (static_cast<unsigned char>(1 << 3))
739 #define TRACE_EVENT_SCOPE_THREAD (static_cast<unsigned char>(2 << 3)) 740 #define TRACE_EVENT_SCOPE_THREAD (static_cast<unsigned char>(2 << 3))
740 741
741 #define TRACE_EVENT_SCOPE_NAME_GLOBAL ('g') 742 #define TRACE_EVENT_SCOPE_NAME_GLOBAL ('g')
742 #define TRACE_EVENT_SCOPE_NAME_PROCESS ('p') 743 #define TRACE_EVENT_SCOPE_NAME_PROCESS ('p')
743 #define TRACE_EVENT_SCOPE_NAME_THREAD ('t') 744 #define TRACE_EVENT_SCOPE_NAME_THREAD ('t')
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 private: 832 private:
832 const char* str_; 833 const char* str_;
833 }; 834 };
834 835
835 // Define SetTraceValue for each allowed type. It stores the type and 836 // Define SetTraceValue for each allowed type. It stores the type and
836 // value in the return arguments. This allows this API to avoid declaring any 837 // value in the return arguments. This allows this API to avoid declaring any
837 // structures so that it is portable to third_party libraries. 838 // structures so that it is portable to third_party libraries.
838 #define INTERNAL_DECLARE_SET_TRACE_VALUE(actual_type, \ 839 #define INTERNAL_DECLARE_SET_TRACE_VALUE(actual_type, \
839 union_member, \ 840 union_member, \
840 value_type_id) \ 841 value_type_id) \
841 static inline void SetTraceValue(actual_type arg, \ 842 static inline void SetTraceValue( \
842 unsigned char* type, \ 843 actual_type arg, \
843 unsigned long long* value) { \ 844 unsigned char* type, \
845 unsigned long long* value, \
846 scoped_ptr<base::debug::ConvertableToJSON>* convertable_value) { \
844 TraceValueUnion type_value; \ 847 TraceValueUnion type_value; \
845 type_value.union_member = arg; \ 848 type_value.union_member = arg; \
846 *type = value_type_id; \ 849 *type = value_type_id; \
847 *value = type_value.as_uint; \ 850 *value = type_value.as_uint; \
848 } 851 }
849 // Simpler form for int types that can be safely casted. 852 // Simpler form for int types that can be safely casted.
850 #define INTERNAL_DECLARE_SET_TRACE_VALUE_INT(actual_type, \ 853 #define INTERNAL_DECLARE_SET_TRACE_VALUE_INT(actual_type, \
851 value_type_id) \ 854 value_type_id) \
852 static inline void SetTraceValue(actual_type arg, \ 855 static inline void SetTraceValue( \
853 unsigned char* type, \ 856 actual_type arg, \
854 unsigned long long* value) { \ 857 unsigned char* type, \
858 unsigned long long* value, \
859 scoped_ptr<base::debug::ConvertableToJSON>* convertable_value) { \
855 *type = value_type_id; \ 860 *type = value_type_id; \
856 *value = static_cast<unsigned long long>(arg); \ 861 *value = static_cast<unsigned long long>(arg); \
857 } 862 }
858 863
859 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long long, TRACE_VALUE_TYPE_UINT) 864 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long long, TRACE_VALUE_TYPE_UINT)
860 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long, TRACE_VALUE_TYPE_UINT) 865 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long, TRACE_VALUE_TYPE_UINT)
861 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned int, TRACE_VALUE_TYPE_UINT) 866 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned int, TRACE_VALUE_TYPE_UINT)
862 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned short, TRACE_VALUE_TYPE_UINT) 867 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned short, TRACE_VALUE_TYPE_UINT)
863 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned char, TRACE_VALUE_TYPE_UINT) 868 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned char, TRACE_VALUE_TYPE_UINT)
864 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(long long, TRACE_VALUE_TYPE_INT) 869 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(long long, TRACE_VALUE_TYPE_INT)
865 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(long, TRACE_VALUE_TYPE_INT) 870 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(long, TRACE_VALUE_TYPE_INT)
866 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(int, TRACE_VALUE_TYPE_INT) 871 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(int, TRACE_VALUE_TYPE_INT)
867 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(short, TRACE_VALUE_TYPE_INT) 872 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(short, TRACE_VALUE_TYPE_INT)
868 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(signed char, TRACE_VALUE_TYPE_INT) 873 INTERNAL_DECLARE_SET_TRACE_VALUE_INT(signed char, TRACE_VALUE_TYPE_INT)
869 INTERNAL_DECLARE_SET_TRACE_VALUE(bool, as_bool, TRACE_VALUE_TYPE_BOOL) 874 INTERNAL_DECLARE_SET_TRACE_VALUE(bool, as_bool, TRACE_VALUE_TYPE_BOOL)
870 INTERNAL_DECLARE_SET_TRACE_VALUE(double, as_double, TRACE_VALUE_TYPE_DOUBLE) 875 INTERNAL_DECLARE_SET_TRACE_VALUE(double, as_double, TRACE_VALUE_TYPE_DOUBLE)
871 INTERNAL_DECLARE_SET_TRACE_VALUE(const void*, as_pointer, 876 INTERNAL_DECLARE_SET_TRACE_VALUE(const void*, as_pointer,
872 TRACE_VALUE_TYPE_POINTER) 877 TRACE_VALUE_TYPE_POINTER)
873 INTERNAL_DECLARE_SET_TRACE_VALUE(const char*, as_string, 878 INTERNAL_DECLARE_SET_TRACE_VALUE(const char*, as_string,
874 TRACE_VALUE_TYPE_STRING) 879 TRACE_VALUE_TYPE_STRING)
875 INTERNAL_DECLARE_SET_TRACE_VALUE(const TraceStringWithCopy&, as_string, 880 INTERNAL_DECLARE_SET_TRACE_VALUE(const TraceStringWithCopy&, as_string,
876 TRACE_VALUE_TYPE_COPY_STRING) 881 TRACE_VALUE_TYPE_COPY_STRING)
877 882
878 #undef INTERNAL_DECLARE_SET_TRACE_VALUE 883 #undef INTERNAL_DECLARE_SET_TRACE_VALUE
879 #undef INTERNAL_DECLARE_SET_TRACE_VALUE_INT 884 #undef INTERNAL_DECLARE_SET_TRACE_VALUE_INT
880 885
881 // std::string version of SetTraceValue so that trace arguments can be strings. 886 // std::string version of SetTraceValue so that trace arguments can be strings.
882 static inline void SetTraceValue(const std::string& arg, 887 static inline void SetTraceValue(
883 unsigned char* type, 888 const std::string& arg,
884 unsigned long long* value) { 889 unsigned char* type,
890 unsigned long long* value,
891 scoped_ptr<base::debug::ConvertableToJSON>* convertable_value) {
885 TraceValueUnion type_value; 892 TraceValueUnion type_value;
886 type_value.as_string = arg.c_str(); 893 type_value.as_string = arg.c_str();
887 *type = TRACE_VALUE_TYPE_COPY_STRING; 894 *type = TRACE_VALUE_TYPE_COPY_STRING;
888 *value = type_value.as_uint; 895 *value = type_value.as_uint;
889 } 896 }
890 897
898 static inline void SetTraceValue(
899 base::debug::ConvertableToJSON* arg,
dsinclair 2013/04/09 22:37:45 This has to be scoped_ptr<base::debug::Convertable
dsinclair 2013/04/10 01:09:31 Done.
900 unsigned char* type,
901 unsigned long long* value,
902 scoped_ptr<base::debug::ConvertableToJSON>* convertable_value) {
903 *type = TRACE_VALUE_TYPE_CONVERTABLE;
904 convertable_value->reset(arg);
905 }
906
891 // These AddTraceEvent and AddTraceEventWithThreadIdAndTimestamp template 907 // These AddTraceEvent and AddTraceEventWithThreadIdAndTimestamp template
892 // functions are defined here instead of in the macro, because the arg_values 908 // functions are defined here instead of in the macro, because the arg_values
893 // could be temporary objects, such as std::string. In order to store 909 // could be temporary objects, such as std::string. In order to store
894 // pointers to the internal c_str and pass through to the tracing API, 910 // pointers to the internal c_str and pass through to the tracing API,
895 // the arg_values must live throughout these procedures. 911 // the arg_values must live throughout these procedures.
896 912
897 static inline void AddTraceEventWithThreadIdAndTimestamp(char phase, 913 static inline void AddTraceEventWithThreadIdAndTimestamp(char phase,
898 const unsigned char* category_enabled, 914 const unsigned char* category_enabled,
899 const char* name, 915 const char* name,
900 unsigned long long id, 916 unsigned long long id,
901 int thread_id, 917 int thread_id,
902 const base::TimeTicks& timestamp, 918 const base::TimeTicks& timestamp,
903 unsigned char flags) { 919 unsigned char flags) {
904 TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP( 920 TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP(
905 phase, category_enabled, name, id, thread_id, timestamp, 921 phase, category_enabled, name, id, thread_id, timestamp,
906 kZeroNumArgs, NULL, NULL, NULL, flags); 922 kZeroNumArgs, NULL, NULL, NULL, NULL, flags);
907 } 923 }
908 924
909 static inline void AddTraceEvent(char phase, 925 static inline void AddTraceEvent(char phase,
910 const unsigned char* category_enabled, 926 const unsigned char* category_enabled,
911 const char* name, 927 const char* name,
912 unsigned long long id, 928 unsigned long long id,
913 unsigned char flags) { 929 unsigned char flags) {
914 int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); 930 int thread_id = static_cast<int>(base::PlatformThread::CurrentId());
915 base::TimeTicks now = base::TimeTicks::NowFromSystemTraceTime(); 931 base::TimeTicks now = base::TimeTicks::NowFromSystemTraceTime();
916 AddTraceEventWithThreadIdAndTimestamp(phase, category_enabled, name, id, 932 AddTraceEventWithThreadIdAndTimestamp(phase, category_enabled, name, id,
917 thread_id, now, flags); 933 thread_id, now, flags);
918 } 934 }
919 935
920 template<class ARG1_TYPE> 936 template<class ARG1_TYPE>
921 static inline void AddTraceEventWithThreadIdAndTimestamp(char phase, 937 static inline void AddTraceEventWithThreadIdAndTimestamp(char phase,
922 const unsigned char* category_enabled, 938 const unsigned char* category_enabled,
923 const char* name, 939 const char* name,
924 unsigned long long id, 940 unsigned long long id,
925 int thread_id, 941 int thread_id,
926 const base::TimeTicks& timestamp, 942 const base::TimeTicks& timestamp,
927 unsigned char flags, 943 unsigned char flags,
928 const char* arg1_name, 944 const char* arg1_name,
929 const ARG1_TYPE& arg1_val) { 945 const ARG1_TYPE& arg1_val) {
930 const int num_args = 1; 946 const int num_args = 1;
931 unsigned char arg_types[1]; 947 unsigned char arg_types[1];
932 unsigned long long arg_values[1]; 948 unsigned long long arg_values[1];
933 SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]); 949 scoped_ptr<base::debug::ConvertableToJSON> convertable_values[1];
950 SetTraceValue(arg1_val, &arg_types[0], &arg_values[0],
951 &convertable_values[0]);
934 TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP( 952 TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP(
935 phase, category_enabled, name, id, thread_id, timestamp, 953 phase, category_enabled, name, id, thread_id, timestamp,
936 num_args, &arg1_name, arg_types, arg_values, flags); 954 num_args, &arg1_name, arg_types, arg_values, convertable_values, flags);
937 } 955 }
938 956
939 template<class ARG1_TYPE> 957 template<class ARG1_TYPE>
940 static inline void AddTraceEvent(char phase, 958 static inline void AddTraceEvent(char phase,
941 const unsigned char* category_enabled, 959 const unsigned char* category_enabled,
942 const char* name, 960 const char* name,
943 unsigned long long id, 961 unsigned long long id,
944 unsigned char flags, 962 unsigned char flags,
945 const char* arg1_name, 963 const char* arg1_name,
946 const ARG1_TYPE& arg1_val) { 964 const ARG1_TYPE& arg1_val) {
(...skipping 13 matching lines...) Expand all
960 const base::TimeTicks& timestamp, 978 const base::TimeTicks& timestamp,
961 unsigned char flags, 979 unsigned char flags,
962 const char* arg1_name, 980 const char* arg1_name,
963 const ARG1_TYPE& arg1_val, 981 const ARG1_TYPE& arg1_val,
964 const char* arg2_name, 982 const char* arg2_name,
965 const ARG2_TYPE& arg2_val) { 983 const ARG2_TYPE& arg2_val) {
966 const int num_args = 2; 984 const int num_args = 2;
967 const char* arg_names[2] = { arg1_name, arg2_name }; 985 const char* arg_names[2] = { arg1_name, arg2_name };
968 unsigned char arg_types[2]; 986 unsigned char arg_types[2];
969 unsigned long long arg_values[2]; 987 unsigned long long arg_values[2];
970 SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]); 988 scoped_ptr<base::debug::ConvertableToJSON> convertable_values[2];
971 SetTraceValue(arg2_val, &arg_types[1], &arg_values[1]); 989 SetTraceValue(arg1_val, &arg_types[0], &arg_values[0],
990 &convertable_values[0]);
991 SetTraceValue(arg2_val, &arg_types[1], &arg_values[1],
992 &convertable_values[1]);
972 TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP( 993 TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP(
973 phase, category_enabled, name, id, thread_id, timestamp, 994 phase, category_enabled, name, id, thread_id, timestamp,
974 num_args, arg_names, arg_types, arg_values, flags); 995 num_args, arg_names, arg_types, arg_values, convertable_values, flags);
975 } 996 }
976 997
977 template<class ARG1_TYPE, class ARG2_TYPE> 998 template<class ARG1_TYPE, class ARG2_TYPE>
978 static inline void AddTraceEvent(char phase, 999 static inline void AddTraceEvent(char phase,
979 const unsigned char* category_enabled, 1000 const unsigned char* category_enabled,
980 const char* name, 1001 const char* name,
981 unsigned long long id, 1002 unsigned long long id,
982 unsigned char flags, 1003 unsigned char flags,
983 const char* arg1_name, 1004 const char* arg1_name,
984 const ARG1_TYPE& arg1_val, 1005 const ARG1_TYPE& arg1_val,
(...skipping 25 matching lines...) Expand all
1010 1031
1011 private: 1032 private:
1012 // Add the end event if the category is still enabled. 1033 // Add the end event if the category is still enabled.
1013 void AddEventIfEnabled() { 1034 void AddEventIfEnabled() {
1014 // Only called when p_data_ is non-null. 1035 // Only called when p_data_ is non-null.
1015 if (*p_data_->category_enabled) { 1036 if (*p_data_->category_enabled) {
1016 TRACE_EVENT_API_ADD_TRACE_EVENT( 1037 TRACE_EVENT_API_ADD_TRACE_EVENT(
1017 TRACE_EVENT_PHASE_END, 1038 TRACE_EVENT_PHASE_END,
1018 p_data_->category_enabled, 1039 p_data_->category_enabled,
1019 p_data_->name, kNoEventId, 1040 p_data_->name, kNoEventId,
1020 kZeroNumArgs, NULL, NULL, NULL, 1041 kZeroNumArgs, NULL, NULL, NULL, NULL,
1021 TRACE_EVENT_FLAG_NONE); 1042 TRACE_EVENT_FLAG_NONE);
1022 } 1043 }
1023 } 1044 }
1024 1045
1025 // This Data struct workaround is to avoid initializing all the members 1046 // This Data struct workaround is to avoid initializing all the members
1026 // in Data during construction of this object, since this object is always 1047 // in Data during construction of this object, since this object is always
1027 // constructed, even when tracing is disabled. If the members of Data were 1048 // constructed, even when tracing is disabled. If the members of Data were
1028 // members of this class instead, compiler warnings occur about potential 1049 // members of this class instead, compiler warnings occur about potential
1029 // uninitialized accesses. 1050 // uninitialized accesses.
1030 struct Data { 1051 struct Data {
(...skipping 26 matching lines...) Expand all
1057 // This macro generates less code then TRACE_EVENT0 but is also 1078 // This macro generates less code then TRACE_EVENT0 but is also
1058 // slower to execute when tracing is off. It should generally only be 1079 // slower to execute when tracing is off. It should generally only be
1059 // used with code that is seldom executed or conditionally executed 1080 // used with code that is seldom executed or conditionally executed
1060 // when debugging. 1081 // when debugging.
1061 #define TRACE_EVENT_BINARY_EFFICIENT0(category, name) \ 1082 #define TRACE_EVENT_BINARY_EFFICIENT0(category, name) \
1062 INTERNAL_TRACE_EVENT_BINARY_EFFICIENT_ADD_SCOPED(category, name) 1083 INTERNAL_TRACE_EVENT_BINARY_EFFICIENT_ADD_SCOPED(category, name)
1063 1084
1064 } // namespace trace_event_internal 1085 } // namespace trace_event_internal
1065 1086
1066 #endif // BASE_DEBUG_TRACE_EVENT_INTERNAL_H_ 1087 #endif // BASE_DEBUG_TRACE_EVENT_INTERNAL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698