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 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 TraceEvent::TraceEvent(int thread_id, | 267 TraceEvent::TraceEvent(int thread_id, |
268 TimeTicks timestamp, | 268 TimeTicks timestamp, |
269 char phase, | 269 char phase, |
270 const unsigned char* category_enabled, | 270 const unsigned char* category_enabled, |
271 const char* name, | 271 const char* name, |
272 unsigned long long id, | 272 unsigned long long id, |
273 int num_args, | 273 int num_args, |
274 const char** arg_names, | 274 const char** arg_names, |
275 const unsigned char* arg_types, | 275 const unsigned char* arg_types, |
276 const unsigned long long* arg_values, | 276 const unsigned long long* arg_values, |
| 277 scoped_ptr<ConvertableToJSON> convertable_values[], |
277 unsigned char flags) | 278 unsigned char flags) |
278 : timestamp_(timestamp), | 279 : timestamp_(timestamp), |
279 id_(id), | 280 id_(id), |
280 category_enabled_(category_enabled), | 281 category_enabled_(category_enabled), |
281 name_(name), | 282 name_(name), |
282 thread_id_(thread_id), | 283 thread_id_(thread_id), |
283 phase_(phase), | 284 phase_(phase), |
284 flags_(flags) { | 285 flags_(flags) { |
285 // Clamp num_args since it may have been set by a third_party library. | 286 // Clamp num_args since it may have been set by a third_party library. |
286 num_args = (num_args > kTraceMaxNumArgs) ? kTraceMaxNumArgs : num_args; | 287 num_args = (num_args > kTraceMaxNumArgs) ? kTraceMaxNumArgs : num_args; |
287 int i = 0; | 288 int i = 0; |
288 for (; i < num_args; ++i) { | 289 for (; i < num_args; ++i) { |
289 arg_names_[i] = arg_names[i]; | 290 arg_names_[i] = arg_names[i]; |
290 arg_values_[i].as_uint = arg_values[i]; | |
291 arg_types_[i] = arg_types[i]; | 291 arg_types_[i] = arg_types[i]; |
| 292 |
| 293 if (arg_types[i] == TRACE_VALUE_TYPE_CONVERTABLE) |
| 294 convertable_values_[i].reset(convertable_values[i].release()); |
| 295 else |
| 296 arg_values_[i].as_uint = arg_values[i]; |
292 } | 297 } |
293 for (; i < kTraceMaxNumArgs; ++i) { | 298 for (; i < kTraceMaxNumArgs; ++i) { |
294 arg_names_[i] = NULL; | 299 arg_names_[i] = NULL; |
295 arg_values_[i].as_uint = 0u; | 300 arg_values_[i].as_uint = 0u; |
| 301 convertable_values_[i].reset(); |
296 arg_types_[i] = TRACE_VALUE_TYPE_UINT; | 302 arg_types_[i] = TRACE_VALUE_TYPE_UINT; |
297 } | 303 } |
298 | 304 |
299 bool copy = !!(flags & TRACE_EVENT_FLAG_COPY); | 305 bool copy = !!(flags & TRACE_EVENT_FLAG_COPY); |
300 size_t alloc_size = 0; | 306 size_t alloc_size = 0; |
301 if (copy) { | 307 if (copy) { |
302 alloc_size += GetAllocLength(name); | 308 alloc_size += GetAllocLength(name); |
303 for (i = 0; i < num_args; ++i) { | 309 for (i = 0; i < num_args; ++i) { |
304 alloc_size += GetAllocLength(arg_names_[i]); | 310 alloc_size += GetAllocLength(arg_names_[i]); |
305 if (arg_types_[i] == TRACE_VALUE_TYPE_STRING) | 311 if (arg_types_[i] == TRACE_VALUE_TYPE_STRING) |
306 arg_types_[i] = TRACE_VALUE_TYPE_COPY_STRING; | 312 arg_types_[i] = TRACE_VALUE_TYPE_COPY_STRING; |
307 } | 313 } |
308 } | 314 } |
309 | 315 |
310 bool arg_is_copy[kTraceMaxNumArgs]; | 316 bool arg_is_copy[kTraceMaxNumArgs]; |
311 for (i = 0; i < num_args; ++i) { | 317 for (i = 0; i < num_args; ++i) { |
| 318 // No copying of convertable types, we retain ownership. |
| 319 if (arg_types_[i] == TRACE_VALUE_TYPE_CONVERTABLE) |
| 320 continue; |
| 321 |
312 // We only take a copy of arg_vals if they are of type COPY_STRING. | 322 // We only take a copy of arg_vals if they are of type COPY_STRING. |
313 arg_is_copy[i] = (arg_types_[i] == TRACE_VALUE_TYPE_COPY_STRING); | 323 arg_is_copy[i] = (arg_types_[i] == TRACE_VALUE_TYPE_COPY_STRING); |
314 if (arg_is_copy[i]) | 324 if (arg_is_copy[i]) |
315 alloc_size += GetAllocLength(arg_values_[i].as_string); | 325 alloc_size += GetAllocLength(arg_values_[i].as_string); |
316 } | 326 } |
317 | 327 |
318 if (alloc_size) { | 328 if (alloc_size) { |
319 parameter_copy_storage_ = new RefCountedString; | 329 parameter_copy_storage_ = new RefCountedString; |
320 parameter_copy_storage_->data().resize(alloc_size); | 330 parameter_copy_storage_->data().resize(alloc_size); |
321 char* ptr = string_as_array(¶meter_copy_storage_->data()); | 331 char* ptr = string_as_array(¶meter_copy_storage_->data()); |
322 const char* end = ptr + alloc_size; | 332 const char* end = ptr + alloc_size; |
323 if (copy) { | 333 if (copy) { |
324 CopyTraceEventParameter(&ptr, &name_, end); | 334 CopyTraceEventParameter(&ptr, &name_, end); |
325 for (i = 0; i < num_args; ++i) | 335 for (i = 0; i < num_args; ++i) { |
| 336 if (arg_types_[i] == TRACE_VALUE_TYPE_CONVERTABLE) |
| 337 continue; |
326 CopyTraceEventParameter(&ptr, &arg_names_[i], end); | 338 CopyTraceEventParameter(&ptr, &arg_names_[i], end); |
| 339 } |
327 } | 340 } |
328 for (i = 0; i < num_args; ++i) { | 341 for (i = 0; i < num_args; ++i) { |
| 342 if (arg_types_[i] == TRACE_VALUE_TYPE_CONVERTABLE) |
| 343 continue; |
329 if (arg_is_copy[i]) | 344 if (arg_is_copy[i]) |
330 CopyTraceEventParameter(&ptr, &arg_values_[i].as_string, end); | 345 CopyTraceEventParameter(&ptr, &arg_values_[i].as_string, end); |
331 } | 346 } |
332 DCHECK_EQ(end, ptr) << "Overrun by " << ptr - end; | 347 DCHECK_EQ(end, ptr) << "Overrun by " << ptr - end; |
333 } | 348 } |
334 } | 349 } |
335 | 350 |
| 351 TraceEvent::TraceEvent(const TraceEvent& other) |
| 352 : timestamp_(other.timestamp_), |
| 353 id_(other.id_), |
| 354 category_enabled_(other.category_enabled_), |
| 355 name_(other.name_), |
| 356 thread_id_(other.thread_id_), |
| 357 phase_(other.phase_), |
| 358 flags_(other.flags_) { |
| 359 parameter_copy_storage_ = other.parameter_copy_storage_; |
| 360 |
| 361 for (int i = 0; i < kTraceMaxNumArgs; ++i) { |
| 362 arg_values_[i] = other.arg_values_[i]; |
| 363 arg_names_[i] = other.arg_names_[i]; |
| 364 arg_types_[i] = other.arg_types_[i]; |
| 365 |
| 366 if (arg_types_[i] == TRACE_VALUE_TYPE_CONVERTABLE) { |
| 367 // TODO(dsinclair): Is this correct? We have to release the pointer from |
| 368 // the other scoped_ptr so we can have it. |
| 369 convertable_values_[i].reset( |
| 370 const_cast<TraceEvent*>(&other)->convertable_values_[i].release()); |
| 371 } else { |
| 372 convertable_values_[i].reset(); |
| 373 } |
| 374 } |
| 375 } |
| 376 |
| 377 TraceEvent& TraceEvent::operator=(const TraceEvent& other) { |
| 378 if (this == &other) |
| 379 return *this; |
| 380 |
| 381 timestamp_ = other.timestamp_; |
| 382 id_ = other.id_; |
| 383 category_enabled_ = other.category_enabled_; |
| 384 name_ = other.name_; |
| 385 parameter_copy_storage_ = other.parameter_copy_storage_; |
| 386 thread_id_ = other.thread_id_; |
| 387 phase_ = other.phase_; |
| 388 flags_ = other.flags_; |
| 389 |
| 390 for (int i = 0; i < kTraceMaxNumArgs; ++i) { |
| 391 arg_values_[i] = other.arg_values_[i]; |
| 392 arg_names_[i] = other.arg_names_[i]; |
| 393 arg_types_[i] = other.arg_types_[i]; |
| 394 |
| 395 if (arg_types_[i] == TRACE_VALUE_TYPE_CONVERTABLE) { |
| 396 // TODO(dsinclair): Is this correct? We have to release the pointer from |
| 397 // the other scoped_ptr so we can have it. |
| 398 convertable_values_[i].reset( |
| 399 const_cast<TraceEvent*>(&other)->convertable_values_[i].release()); |
| 400 } else { |
| 401 convertable_values_[i].reset(); |
| 402 } |
| 403 } |
| 404 return *this; |
| 405 } |
| 406 |
336 TraceEvent::~TraceEvent() { | 407 TraceEvent::~TraceEvent() { |
337 } | 408 } |
338 | 409 |
339 // static | 410 // static |
340 void TraceEvent::AppendValueAsJSON(unsigned char type, | 411 void TraceEvent::AppendValueAsJSON(unsigned char type, |
341 TraceEvent::TraceValue value, | 412 TraceEvent::TraceValue value, |
342 std::string* out) { | 413 std::string* out) { |
343 std::string::size_type start_pos; | 414 std::string::size_type start_pos; |
344 switch (type) { | 415 switch (type) { |
345 case TRACE_VALUE_TYPE_BOOL: | 416 case TRACE_VALUE_TYPE_BOOL: |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 phase_, | 467 phase_, |
397 name_); | 468 name_); |
398 | 469 |
399 // Output argument names and values, stop at first NULL argument name. | 470 // Output argument names and values, stop at first NULL argument name. |
400 for (int i = 0; i < kTraceMaxNumArgs && arg_names_[i]; ++i) { | 471 for (int i = 0; i < kTraceMaxNumArgs && arg_names_[i]; ++i) { |
401 if (i > 0) | 472 if (i > 0) |
402 *out += ","; | 473 *out += ","; |
403 *out += "\""; | 474 *out += "\""; |
404 *out += arg_names_[i]; | 475 *out += arg_names_[i]; |
405 *out += "\":"; | 476 *out += "\":"; |
406 AppendValueAsJSON(arg_types_[i], arg_values_[i], out); | 477 |
| 478 if (arg_types_[i] == TRACE_VALUE_TYPE_CONVERTABLE) |
| 479 convertable_values_[i]->ToJSON(*out); |
| 480 else |
| 481 AppendValueAsJSON(arg_types_[i], arg_values_[i], out); |
407 } | 482 } |
408 *out += "}"; | 483 *out += "}"; |
409 | 484 |
410 // If id_ is set, print it out as a hex string so we don't loose any | 485 // If id_ is set, print it out as a hex string so we don't loose any |
411 // bits (it might be a 64-bit pointer). | 486 // bits (it might be a 64-bit pointer). |
412 if (flags_ & TRACE_EVENT_FLAG_HAS_ID) | 487 if (flags_ & TRACE_EVENT_FLAG_HAS_ID) |
413 StringAppendF(out, ",\"id\":\"%" PRIx64 "\"", static_cast<uint64>(id_)); | 488 StringAppendF(out, ",\"id\":\"%" PRIx64 "\"", static_cast<uint64>(id_)); |
414 | 489 |
415 // Instant events also output their scope. | 490 // Instant events also output their scope. |
416 if (phase_ == TRACE_EVENT_PHASE_INSTANT) { | 491 if (phase_ == TRACE_EVENT_PHASE_INSTANT) { |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 TRACE_EVENT_API_ATOMIC_LOAD(*bucket_data->bucket); | 633 TRACE_EVENT_API_ATOMIC_LOAD(*bucket_data->bucket); |
559 if (!category_and_name) | 634 if (!category_and_name) |
560 return; | 635 return; |
561 const char* const combined = | 636 const char* const combined = |
562 reinterpret_cast<const char* const>(category_and_name); | 637 reinterpret_cast<const char* const>(category_and_name); |
563 const char* category; | 638 const char* category; |
564 const char* name; | 639 const char* name; |
565 ExtractCategoryAndName(combined, &category, &name); | 640 ExtractCategoryAndName(combined, &category, &name); |
566 TRACE_EVENT_API_ADD_TRACE_EVENT(TRACE_EVENT_PHASE_SAMPLE, | 641 TRACE_EVENT_API_ADD_TRACE_EVENT(TRACE_EVENT_PHASE_SAMPLE, |
567 TraceLog::GetCategoryEnabled(category), | 642 TraceLog::GetCategoryEnabled(category), |
568 name, | 643 name, 0, 0, NULL, NULL, NULL, NULL, 0); |
569 0, | |
570 0, | |
571 NULL, | |
572 NULL, | |
573 NULL, | |
574 0); | |
575 } | 644 } |
576 | 645 |
577 void TraceSamplingThread::GetSamples() { | 646 void TraceSamplingThread::GetSamples() { |
578 for (size_t i = 0; i < sample_buckets_.size(); ++i) { | 647 for (size_t i = 0; i < sample_buckets_.size(); ++i) { |
579 TraceBucketData* bucket_data = &sample_buckets_[i]; | 648 TraceBucketData* bucket_data = &sample_buckets_[i]; |
580 bucket_data->callback.Run(bucket_data); | 649 bucket_data->callback.Run(bucket_data); |
581 } | 650 } |
582 } | 651 } |
583 | 652 |
584 void TraceSamplingThread::RegisterSampleBucket( | 653 void TraceSamplingThread::RegisterSampleBucket( |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1007 &(json_events_str_ptr->data())); | 1076 &(json_events_str_ptr->data())); |
1008 | 1077 |
1009 if (!previous_logged_events->HasMoreEvents()) | 1078 if (!previous_logged_events->HasMoreEvents()) |
1010 break; | 1079 break; |
1011 } | 1080 } |
1012 | 1081 |
1013 cb.Run(json_events_str_ptr); | 1082 cb.Run(json_events_str_ptr); |
1014 } | 1083 } |
1015 } | 1084 } |
1016 | 1085 |
1017 void TraceLog::AddTraceEvent(char phase, | 1086 void TraceLog::AddTraceEvent( |
1018 const unsigned char* category_enabled, | 1087 char phase, |
1019 const char* name, | 1088 const unsigned char* category_enabled, |
1020 unsigned long long id, | 1089 const char* name, |
1021 int num_args, | 1090 unsigned long long id, |
1022 const char** arg_names, | 1091 int num_args, |
1023 const unsigned char* arg_types, | 1092 const char** arg_names, |
1024 const unsigned long long* arg_values, | 1093 const unsigned char* arg_types, |
1025 unsigned char flags) { | 1094 const unsigned long long* arg_values, |
| 1095 scoped_ptr<ConvertableToJSON> convertable_values[], |
| 1096 unsigned char flags) { |
1026 int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); | 1097 int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); |
1027 base::TimeTicks now = base::TimeTicks::NowFromSystemTraceTime(); | 1098 base::TimeTicks now = base::TimeTicks::NowFromSystemTraceTime(); |
1028 AddTraceEventWithThreadIdAndTimestamp(phase, category_enabled, name, id, | 1099 AddTraceEventWithThreadIdAndTimestamp(phase, category_enabled, name, id, |
1029 thread_id, now, num_args, arg_names, | 1100 thread_id, now, num_args, arg_names, |
1030 arg_types, arg_values, flags); | 1101 arg_types, arg_values, |
| 1102 convertable_values, flags); |
1031 } | 1103 } |
1032 | 1104 |
1033 void TraceLog::AddTraceEventWithThreadIdAndTimestamp( | 1105 void TraceLog::AddTraceEventWithThreadIdAndTimestamp( |
1034 char phase, | 1106 char phase, |
1035 const unsigned char* category_enabled, | 1107 const unsigned char* category_enabled, |
1036 const char* name, | 1108 const char* name, |
1037 unsigned long long id, | 1109 unsigned long long id, |
1038 int thread_id, | 1110 int thread_id, |
1039 const TimeTicks& timestamp, | 1111 const TimeTicks& timestamp, |
1040 int num_args, | 1112 int num_args, |
1041 const char** arg_names, | 1113 const char** arg_names, |
1042 const unsigned char* arg_types, | 1114 const unsigned char* arg_types, |
1043 const unsigned long long* arg_values, | 1115 const unsigned long long* arg_values, |
| 1116 scoped_ptr<ConvertableToJSON> convertable_values[], |
1044 unsigned char flags) { | 1117 unsigned char flags) { |
1045 DCHECK(name); | 1118 DCHECK(name); |
1046 | 1119 |
1047 if (flags & TRACE_EVENT_FLAG_MANGLE_ID) | 1120 if (flags & TRACE_EVENT_FLAG_MANGLE_ID) |
1048 id ^= process_id_hash_; | 1121 id ^= process_id_hash_; |
1049 | 1122 |
1050 #if defined(OS_ANDROID) | 1123 #if defined(OS_ANDROID) |
1051 SendToATrace(phase, GetCategoryName(category_enabled), name, id, | 1124 SendToATrace(phase, GetCategoryName(category_enabled), name, id, |
1052 num_args, arg_names, arg_types, arg_values, flags); | 1125 num_args, arg_names, arg_types, arg_values, flags); |
1053 #endif | 1126 #endif |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1090 if (!found) { | 1163 if (!found) { |
1091 existing_name->second.push_back(','); | 1164 existing_name->second.push_back(','); |
1092 existing_name->second.append(new_name); | 1165 existing_name->second.append(new_name); |
1093 } | 1166 } |
1094 } | 1167 } |
1095 } | 1168 } |
1096 | 1169 |
1097 logged_events_->AddEvent(TraceEvent(thread_id, | 1170 logged_events_->AddEvent(TraceEvent(thread_id, |
1098 now, phase, category_enabled, name, id, | 1171 now, phase, category_enabled, name, id, |
1099 num_args, arg_names, arg_types, arg_values, | 1172 num_args, arg_names, arg_types, arg_values, |
1100 flags)); | 1173 convertable_values, flags)); |
1101 | 1174 |
1102 if (logged_events_->IsFull()) | 1175 if (logged_events_->IsFull()) |
1103 notifier.AddNotificationWhileLocked(TRACE_BUFFER_FULL); | 1176 notifier.AddNotificationWhileLocked(TRACE_BUFFER_FULL); |
1104 | 1177 |
1105 if (watch_category_ == category_enabled && watch_event_name_ == name) | 1178 if (watch_category_ == category_enabled && watch_event_name_ == name) |
1106 notifier.AddNotificationWhileLocked(EVENT_WATCH_NOTIFICATION); | 1179 notifier.AddNotificationWhileLocked(EVENT_WATCH_NOTIFICATION); |
1107 | 1180 |
1108 event_callback_copy = event_callback_; | 1181 event_callback_copy = event_callback_; |
1109 } // release lock | 1182 } // release lock |
1110 | 1183 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1172 void TraceLog::AddThreadNameMetadataEvents() { | 1245 void TraceLog::AddThreadNameMetadataEvents() { |
1173 lock_.AssertAcquired(); | 1246 lock_.AssertAcquired(); |
1174 for(hash_map<int, std::string>::iterator it = thread_names_.begin(); | 1247 for(hash_map<int, std::string>::iterator it = thread_names_.begin(); |
1175 it != thread_names_.end(); | 1248 it != thread_names_.end(); |
1176 it++) { | 1249 it++) { |
1177 if (!it->second.empty()) { | 1250 if (!it->second.empty()) { |
1178 int num_args = 1; | 1251 int num_args = 1; |
1179 const char* arg_name = "name"; | 1252 const char* arg_name = "name"; |
1180 unsigned char arg_type; | 1253 unsigned char arg_type; |
1181 unsigned long long arg_value; | 1254 unsigned long long arg_value; |
1182 trace_event_internal::SetTraceValue(it->second, &arg_type, &arg_value); | 1255 trace_event_internal::SetTraceValue(it->second, &arg_type, &arg_value, |
| 1256 NULL); |
1183 logged_events_->AddEvent(TraceEvent(it->first, | 1257 logged_events_->AddEvent(TraceEvent(it->first, |
1184 TimeTicks(), TRACE_EVENT_PHASE_METADATA, | 1258 TimeTicks(), TRACE_EVENT_PHASE_METADATA, |
1185 &g_category_enabled[g_category_metadata], | 1259 &g_category_enabled[g_category_metadata], |
1186 "thread_name", trace_event_internal::kNoEventId, | 1260 "thread_name", trace_event_internal::kNoEventId, |
1187 num_args, &arg_name, &arg_type, &arg_value, | 1261 num_args, &arg_name, &arg_type, &arg_value, NULL, |
1188 TRACE_EVENT_FLAG_NONE)); | 1262 TRACE_EVENT_FLAG_NONE)); |
1189 } | 1263 } |
1190 } | 1264 } |
1191 } | 1265 } |
1192 | 1266 |
1193 void TraceLog::InstallWaitableEventForSamplingTesting( | 1267 void TraceLog::InstallWaitableEventForSamplingTesting( |
1194 WaitableEvent* waitable_event) { | 1268 WaitableEvent* waitable_event) { |
1195 sampling_thread_->InstallWaitableEventForSamplingTesting(waitable_event); | 1269 sampling_thread_->InstallWaitableEventForSamplingTesting(waitable_event); |
1196 } | 1270 } |
1197 | 1271 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1237 name_ = name; | 1311 name_ = name; |
1238 TRACE_EVENT_API_ADD_TRACE_EVENT( | 1312 TRACE_EVENT_API_ADD_TRACE_EVENT( |
1239 TRACE_EVENT_PHASE_BEGIN, // phase | 1313 TRACE_EVENT_PHASE_BEGIN, // phase |
1240 category_enabled_, // category enabled | 1314 category_enabled_, // category enabled |
1241 name, // name | 1315 name, // name |
1242 0, // id | 1316 0, // id |
1243 0, // num_args | 1317 0, // num_args |
1244 NULL, // arg_names | 1318 NULL, // arg_names |
1245 NULL, // arg_types | 1319 NULL, // arg_types |
1246 NULL, // arg_values | 1320 NULL, // arg_values |
| 1321 NULL, // convertable_values |
1247 TRACE_EVENT_FLAG_NONE); // flags | 1322 TRACE_EVENT_FLAG_NONE); // flags |
1248 } else { | 1323 } else { |
1249 category_enabled_ = NULL; | 1324 category_enabled_ = NULL; |
1250 } | 1325 } |
1251 } | 1326 } |
1252 | 1327 |
1253 ScopedTrace::~ScopedTrace() { | 1328 ScopedTrace::~ScopedTrace() { |
1254 if (category_enabled_ && *category_enabled_) { | 1329 if (category_enabled_ && *category_enabled_) { |
1255 TRACE_EVENT_API_ADD_TRACE_EVENT( | 1330 TRACE_EVENT_API_ADD_TRACE_EVENT( |
1256 TRACE_EVENT_PHASE_END, // phase | 1331 TRACE_EVENT_PHASE_END, // phase |
1257 category_enabled_, // category enabled | 1332 category_enabled_, // category enabled |
1258 name_, // name | 1333 name_, // name |
1259 0, // id | 1334 0, // id |
1260 0, // num_args | 1335 0, // num_args |
1261 NULL, // arg_names | 1336 NULL, // arg_names |
1262 NULL, // arg_types | 1337 NULL, // arg_types |
1263 NULL, // arg_values | 1338 NULL, // arg_values |
| 1339 NULL, // convertable values |
1264 TRACE_EVENT_FLAG_NONE); // flags | 1340 TRACE_EVENT_FLAG_NONE); // flags |
1265 } | 1341 } |
1266 } | 1342 } |
1267 | 1343 |
1268 } // namespace trace_event_internal | 1344 } // namespace trace_event_internal |
1269 | 1345 |
OLD | NEW |