Chromium Code Reviews| 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 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 386 uintptr_t category_ptr = reinterpret_cast<uintptr_t>(category_enabled); | 386 uintptr_t category_ptr = reinterpret_cast<uintptr_t>(category_enabled); |
| 387 DCHECK(category_ptr >= category_begin && | 387 DCHECK(category_ptr >= category_begin && |
| 388 category_ptr < reinterpret_cast<uintptr_t>(g_category_enabled + | 388 category_ptr < reinterpret_cast<uintptr_t>(g_category_enabled + |
| 389 TRACE_EVENT_MAX_CATEGORIES)) << | 389 TRACE_EVENT_MAX_CATEGORIES)) << |
| 390 "out of bounds category pointer"; | 390 "out of bounds category pointer"; |
| 391 uintptr_t category_index = | 391 uintptr_t category_index = |
| 392 (category_ptr - category_begin) / sizeof(g_category_enabled[0]); | 392 (category_ptr - category_begin) / sizeof(g_category_enabled[0]); |
| 393 return g_categories[category_index]; | 393 return g_categories[category_index]; |
| 394 } | 394 } |
| 395 | 395 |
| 396 static bool DoesCategoryContainMatchingTag(const char* tagged_category, | |
|
rterrazas
2013/01/15 08:08:31
Implemented the support for multi tag and single t
| |
| 397 const char* tag_pattern) { | |
| 398 CStringTokenizer tag_tokens(tagged_category, | |
| 399 tagged_category + strlen(tagged_category), ","); | |
| 400 while (tag_tokens.GetNext()) { | |
| 401 std::string trimmed_tag; | |
| 402 //Trimming tokens to allow categories with arbitrary spaces: | |
| 403 // i.e: "webkit, input" or "webkit , input". | |
| 404 TrimWhitespaceASCII(tag_tokens.token(), TRIM_ALL, &trimmed_tag); | |
| 405 if(trimmed_tag.length() == 0) | |
| 406 continue; | |
| 407 if (MatchPattern(trimmed_tag.c_str(), tag_pattern)) | |
| 408 return true; | |
| 409 } | |
| 410 return false; | |
| 411 } | |
| 412 | |
| 396 static void EnableMatchingCategory(int category_index, | 413 static void EnableMatchingCategory(int category_index, |
| 397 const std::vector<std::string>& patterns, | 414 const std::vector<std::string>& tag_patterns, |
| 398 unsigned char matched_value, | 415 unsigned char matched_value, |
| 399 unsigned char unmatched_value) { | 416 unsigned char unmatched_value) { |
| 400 std::vector<std::string>::const_iterator ci = patterns.begin(); | 417 std::vector<std::string>::const_iterator ci = tag_patterns.begin(); |
| 401 bool is_match = false; | 418 bool is_match = false; |
| 402 for (; ci != patterns.end(); ++ci) { | 419 for (; ci != tag_patterns.end(); ++ci) { |
| 403 is_match = MatchPattern(g_categories[category_index], ci->c_str()); | 420 is_match = DoesCategoryContainMatchingTag(g_categories[category_index], |
| 421 ci->c_str()); | |
| 422 | |
| 404 if (is_match) | 423 if (is_match) |
| 405 break; | 424 break; |
| 406 } | 425 } |
| 407 g_category_enabled[category_index] = is_match ? | 426 g_category_enabled[category_index] = is_match ? |
| 408 matched_value : unmatched_value; | 427 matched_value : unmatched_value; |
| 409 } | 428 } |
| 410 | 429 |
| 411 // Enable/disable each category based on the category filters in |patterns|. | 430 // Enable/disable each category based on the category filters in |tag_patterns|. |
| 412 // If the category name matches one of the patterns, its enabled status is set | 431 // If the category name contains a tag that matches one of the tag_patterns, |
| 413 // to |matched_value|. Otherwise its enabled status is set to |unmatched_value|. | 432 // its enabled status is set to |matched_value|. |
| 414 static void EnableMatchingCategories(const std::vector<std::string>& patterns, | 433 // Otherwise its enabled status is set to |unmatched_value|. |
| 415 unsigned char matched_value, | 434 static void EnableMatchingCategories( |
| 416 unsigned char unmatched_value) { | 435 const std::vector<std::string>& tag_patterns, |
| 436 unsigned char matched_value, | |
| 437 unsigned char unmatched_value) { | |
| 417 for (int i = 0; i < g_category_index; i++) | 438 for (int i = 0; i < g_category_index; i++) |
| 418 EnableMatchingCategory(i, patterns, matched_value, unmatched_value); | 439 EnableMatchingCategory(i, tag_patterns, matched_value, unmatched_value); |
| 419 } | 440 } |
| 420 | 441 |
| 421 const unsigned char* TraceLog::GetCategoryEnabledInternal(const char* name) { | 442 const unsigned char* TraceLog::GetCategoryEnabledInternal(const char* name) { |
| 422 AutoLock lock(lock_); | 443 AutoLock lock(lock_); |
| 423 DCHECK(!strchr(name, '"')) << "Category names may not contain double quote"; | 444 DCHECK(!strchr(name, '"')) << "Category names may not contain double quote"; |
| 424 | 445 |
| 425 unsigned char* category_enabled = NULL; | 446 unsigned char* category_enabled = NULL; |
| 426 // Search for pre-existing category matching this name | 447 // Search for pre-existing category matching this name |
| 427 for (int i = 0; i < g_category_index; i++) { | 448 for (int i = 0; i < g_category_index; i++) { |
| 428 if (strcmp(g_categories[i], name) == 0) { | 449 if (strcmp(g_categories[i], name) == 0) { |
| 429 category_enabled = &g_category_enabled[i]; | 450 category_enabled = &g_category_enabled[i]; |
| 430 break; | 451 break; |
| 431 } | 452 } |
| 432 } | 453 } |
| 433 | 454 |
| 434 if (!category_enabled) { | 455 if (!category_enabled) { |
| 435 // Create a new category | 456 // Create a new category |
| 436 DCHECK(g_category_index < TRACE_EVENT_MAX_CATEGORIES) << | 457 DCHECK(g_category_index < TRACE_EVENT_MAX_CATEGORIES) << |
| 437 "must increase TRACE_EVENT_MAX_CATEGORIES"; | 458 "must increase TRACE_EVENT_MAX_CATEGORIES"; |
| 438 if (g_category_index < TRACE_EVENT_MAX_CATEGORIES) { | 459 if (g_category_index < TRACE_EVENT_MAX_CATEGORIES) { |
| 439 int new_index = g_category_index++; | 460 int new_index = g_category_index++; |
| 440 // Don't hold on to the name pointer, so that we can create categories | 461 // Don't hold on to the name pointer, so that we can create categories |
| 441 // with strings not known at compile time (this is required by | 462 // with strings not known at compile time (this is required by |
| 442 // SetWatchEvent). | 463 // SetWatchEvent). |
| 443 const char* new_name = base::strdup(name); | 464 const char* new_name = base::strdup(name); |
| 444 ANNOTATE_LEAKING_OBJECT_PTR(new_name); | 465 ANNOTATE_LEAKING_OBJECT_PTR(new_name); |
| 445 g_categories[new_index] = new_name; | 466 g_categories[new_index] = new_name; |
| 446 DCHECK(!g_category_enabled[new_index]); | 467 DCHECK(!g_category_enabled[new_index]); |
| 447 if (enabled_) { | 468 if (enabled_) { |
| 448 // Note that if both included and excluded_categories are empty, the | 469 // Note that if both included and excluded_tag_patterns are empty, the |
| 449 // else clause below excludes nothing, thereby enabling this category. | 470 // else clause below excludes nothing, thereby enabling this category. |
| 450 if (!included_categories_.empty()) { | 471 if (!included_tag_patterns_.empty()) { |
| 451 EnableMatchingCategory(new_index, included_categories_, | 472 EnableMatchingCategory(new_index, included_tag_patterns_, |
| 452 CATEGORY_ENABLED, 0); | 473 CATEGORY_ENABLED, 0); |
| 453 } else { | 474 } else { |
| 454 EnableMatchingCategory(new_index, excluded_categories_, | 475 EnableMatchingCategory(new_index, excluded_tag_patterns_, |
| 455 0, CATEGORY_ENABLED); | 476 0, CATEGORY_ENABLED); |
| 456 } | 477 } |
| 457 } else { | 478 } else { |
| 458 g_category_enabled[new_index] = 0; | 479 g_category_enabled[new_index] = 0; |
| 459 } | 480 } |
| 460 category_enabled = &g_category_enabled[new_index]; | 481 category_enabled = &g_category_enabled[new_index]; |
| 461 } else { | 482 } else { |
| 462 category_enabled = &g_category_enabled[g_category_categories_exhausted]; | 483 category_enabled = &g_category_enabled[g_category_categories_exhausted]; |
| 463 } | 484 } |
| 464 } | 485 } |
| 465 #if defined(OS_ANDROID) | 486 #if defined(OS_ANDROID) |
| 466 ApplyATraceEnabledFlag(category_enabled); | 487 ApplyATraceEnabledFlag(category_enabled); |
| 467 #endif | 488 #endif |
| 468 return category_enabled; | 489 return category_enabled; |
| 469 } | 490 } |
| 470 | 491 |
| 471 void TraceLog::GetKnownCategories(std::vector<std::string>* categories) { | 492 void TraceLog::GetKnownCategories(std::vector<std::string>* categories) { |
| 472 AutoLock lock(lock_); | 493 AutoLock lock(lock_); |
| 473 for (int i = 0; i < g_category_index; i++) | 494 for (int i = 0; i < g_category_index; i++) |
| 474 categories->push_back(g_categories[i]); | 495 categories->push_back(g_categories[i]); |
| 475 } | 496 } |
| 476 | 497 |
| 477 void TraceLog::SetEnabled(const std::vector<std::string>& included_categories, | 498 void TraceLog::SetEnabled(const std::vector<std::string>& included_tag_patterns, |
| 478 const std::vector<std::string>& excluded_categories) { | 499 const std::vector<std::string>& excluded_tag_patterns) { |
|
rterrazas
2013/01/15 08:08:31
Crossed the 80 char barrier, seemed moving the par
rterrazas
2013/01/18 01:25:35
Done.
| |
| 479 AutoLock lock(lock_); | 500 AutoLock lock(lock_); |
| 480 if (enabled_) | 501 if (enabled_) |
| 481 return; | 502 return; |
| 482 | 503 |
| 483 if (dispatching_to_observer_list_) { | 504 if (dispatching_to_observer_list_) { |
| 484 DLOG(ERROR) << | 505 DLOG(ERROR) << |
| 485 "Cannot manipulate TraceLog::Enabled state from an observer."; | 506 "Cannot manipulate TraceLog::Enabled state from an observer."; |
| 486 return; | 507 return; |
| 487 } | 508 } |
| 488 | 509 |
| 489 dispatching_to_observer_list_ = true; | 510 dispatching_to_observer_list_ = true; |
| 490 FOR_EACH_OBSERVER(EnabledStateChangedObserver, enabled_state_observer_list_, | 511 FOR_EACH_OBSERVER(EnabledStateChangedObserver, enabled_state_observer_list_, |
| 491 OnTraceLogWillEnable()); | 512 OnTraceLogWillEnable()); |
| 492 dispatching_to_observer_list_ = false; | 513 dispatching_to_observer_list_ = false; |
| 493 | 514 |
| 494 logged_events_.reserve(1024); | 515 logged_events_.reserve(1024); |
| 495 enabled_ = true; | 516 enabled_ = true; |
| 496 included_categories_ = included_categories; | 517 included_tag_patterns_ = included_tag_patterns; |
| 497 excluded_categories_ = excluded_categories; | 518 excluded_tag_patterns_ = excluded_tag_patterns; |
| 498 // Note that if both included and excluded_categories are empty, the else | 519 // Note that if both included and excluded_tag_patterns are empty, the |
| 499 // clause below excludes nothing, thereby enabling all categories. | 520 // else clause below excludes nothing, thereby enabling all categories. |
| 500 if (!included_categories_.empty()) | 521 if (!included_tag_patterns_.empty()) |
| 501 EnableMatchingCategories(included_categories_, CATEGORY_ENABLED, 0); | 522 EnableMatchingCategories(included_tag_patterns_, CATEGORY_ENABLED, 0); |
| 502 else | 523 else |
| 503 EnableMatchingCategories(excluded_categories_, 0, CATEGORY_ENABLED); | 524 EnableMatchingCategories(excluded_tag_patterns_, 0, CATEGORY_ENABLED); |
| 504 } | 525 } |
| 505 | 526 |
| 506 void TraceLog::SetEnabled(const std::string& categories) { | 527 void TraceLog::SetEnabled(const std::string& tag_patterns) { |
| 507 std::vector<std::string> included, excluded; | 528 std::vector<std::string> included, excluded; |
| 508 // Tokenize list of categories, delimited by ','. | 529 // Tokenize list of tag patterns, delimited by ','. |
| 509 StringTokenizer tokens(categories, ","); | 530 StringTokenizer tokens(tag_patterns, ","); |
| 510 while (tokens.GetNext()) { | 531 while (tokens.GetNext()) { |
| 511 bool is_included = true; | 532 bool is_included = true; |
| 512 std::string category = tokens.token(); | 533 std::string tag_pattern = tokens.token(); |
| 513 // Excluded categories start with '-'. | 534 // Excluded tags start with '-'. |
| 514 if (category.at(0) == '-') { | 535 if (tag_pattern.at(0) == '-') { |
| 515 // Remove '-' from category string. | 536 // Remove '-' from tag pattern string. |
| 516 category = category.substr(1); | 537 tag_pattern = tag_pattern.substr(1); |
| 517 is_included = false; | 538 is_included = false; |
| 518 } | 539 } |
| 519 if (is_included) | 540 if (is_included) |
| 520 included.push_back(category); | 541 included.push_back(tag_pattern); |
| 521 else | 542 else |
| 522 excluded.push_back(category); | 543 excluded.push_back(tag_pattern); |
| 523 } | 544 } |
| 524 SetEnabled(included, excluded); | 545 SetEnabled(included, excluded); |
| 525 } | 546 } |
| 526 | 547 |
| 527 void TraceLog::GetEnabledTraceCategories( | 548 void TraceLog::GetEnabledTraceCategories( |
| 528 std::vector<std::string>* included_out, | 549 std::vector<std::string>* included_out, |
| 529 std::vector<std::string>* excluded_out) { | 550 std::vector<std::string>* excluded_out) { |
| 530 AutoLock lock(lock_); | 551 AutoLock lock(lock_); |
| 531 if (enabled_) { | 552 if (enabled_) { |
| 532 *included_out = included_categories_; | 553 *included_out = included_tag_patterns_; |
| 533 *excluded_out = excluded_categories_; | 554 *excluded_out = excluded_tag_patterns_; |
| 534 } | 555 } |
| 535 } | 556 } |
| 536 | 557 |
| 537 void TraceLog::SetDisabled() { | 558 void TraceLog::SetDisabled() { |
| 538 AutoLock lock(lock_); | 559 AutoLock lock(lock_); |
| 539 if (!enabled_) | 560 if (!enabled_) |
| 540 return; | 561 return; |
| 541 | 562 |
| 542 if (dispatching_to_observer_list_) { | 563 if (dispatching_to_observer_list_) { |
| 543 DLOG(ERROR) | 564 DLOG(ERROR) |
| 544 << "Cannot manipulate TraceLog::Enabled state from an observer."; | 565 << "Cannot manipulate TraceLog::Enabled state from an observer."; |
| 545 return; | 566 return; |
| 546 } | 567 } |
| 547 | 568 |
| 548 dispatching_to_observer_list_ = true; | 569 dispatching_to_observer_list_ = true; |
| 549 FOR_EACH_OBSERVER(EnabledStateChangedObserver, enabled_state_observer_list_, | 570 FOR_EACH_OBSERVER(EnabledStateChangedObserver, enabled_state_observer_list_, |
| 550 OnTraceLogWillDisable()); | 571 OnTraceLogWillDisable()); |
| 551 dispatching_to_observer_list_ = false; | 572 dispatching_to_observer_list_ = false; |
| 552 | 573 |
| 553 enabled_ = false; | 574 enabled_ = false; |
| 554 included_categories_.clear(); | 575 included_tag_patterns_.clear(); |
| 555 excluded_categories_.clear(); | 576 excluded_tag_patterns_.clear(); |
| 556 watch_category_ = NULL; | 577 watch_category_ = NULL; |
| 557 watch_event_name_ = ""; | 578 watch_event_name_ = ""; |
| 558 for (int i = 0; i < g_category_index; i++) | 579 for (int i = 0; i < g_category_index; i++) |
| 559 g_category_enabled[i] = 0; | 580 g_category_enabled[i] = 0; |
| 560 AddThreadNameMetadataEvents(); | 581 AddThreadNameMetadataEvents(); |
| 561 #if defined(OS_ANDROID) | 582 #if defined(OS_ANDROID) |
| 562 AddClockSyncMetadataEvents(); | 583 AddClockSyncMetadataEvents(); |
| 563 #endif | 584 #endif |
| 564 } | 585 } |
| 565 | 586 |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 780 unsigned long long pid = static_cast<unsigned long long>(process_id_); | 801 unsigned long long pid = static_cast<unsigned long long>(process_id_); |
| 781 process_id_hash_ = (offset_basis ^ pid) * fnv_prime; | 802 process_id_hash_ = (offset_basis ^ pid) * fnv_prime; |
| 782 } | 803 } |
| 783 | 804 |
| 784 void TraceLog::SetTimeOffset(TimeDelta offset) { | 805 void TraceLog::SetTimeOffset(TimeDelta offset) { |
| 785 time_offset_ = offset; | 806 time_offset_ = offset; |
| 786 } | 807 } |
| 787 | 808 |
| 788 } // namespace debug | 809 } // namespace debug |
| 789 } // namespace base | 810 } // namespace base |
| OLD | NEW |