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

Side by Side Diff: chrome/browser/metrics/metrics_service.cc

Issue 7327007: Moving notification types which are chrome specific to a new header file chrome_notification_type... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/metrics/metrics_service.h ('k') | chrome/browser/metrics/thread_watcher.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 //------------------------------------------------------------------------------ 5 //------------------------------------------------------------------------------
6 // Description of the life cycle of a instance of MetricsService. 6 // Description of the life cycle of a instance of MetricsService.
7 // 7 //
8 // OVERVIEW 8 // OVERVIEW
9 // 9 //
10 // A MetricsService instance is typically created at application startup. It 10 // A MetricsService instance is typically created at application startup. It
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 #include "chrome/browser/metrics/histogram_synchronizer.h" 174 #include "chrome/browser/metrics/histogram_synchronizer.h"
175 #include "chrome/browser/metrics/metrics_log.h" 175 #include "chrome/browser/metrics/metrics_log.h"
176 #include "chrome/browser/metrics/metrics_reporting_scheduler.h" 176 #include "chrome/browser/metrics/metrics_reporting_scheduler.h"
177 #include "chrome/browser/net/network_stats.h" 177 #include "chrome/browser/net/network_stats.h"
178 #include "chrome/browser/prefs/pref_service.h" 178 #include "chrome/browser/prefs/pref_service.h"
179 #include "chrome/browser/prefs/scoped_user_pref_update.h" 179 #include "chrome/browser/prefs/scoped_user_pref_update.h"
180 #include "chrome/browser/profiles/profile.h" 180 #include "chrome/browser/profiles/profile.h"
181 #include "chrome/browser/search_engines/template_url_service.h" 181 #include "chrome/browser/search_engines/template_url_service.h"
182 #include "chrome/browser/ui/browser_list.h" 182 #include "chrome/browser/ui/browser_list.h"
183 #include "chrome/common/child_process_logging.h" 183 #include "chrome/common/child_process_logging.h"
184 #include "chrome/common/chrome_notification_types.h"
184 #include "chrome/common/chrome_switches.h" 185 #include "chrome/common/chrome_switches.h"
185 #include "chrome/common/guid.h" 186 #include "chrome/common/guid.h"
186 #include "chrome/common/pref_names.h" 187 #include "chrome/common/pref_names.h"
187 #include "chrome/common/render_messages.h" 188 #include "chrome/common/render_messages.h"
188 #include "content/browser/load_notification_details.h" 189 #include "content/browser/load_notification_details.h"
189 #include "content/browser/renderer_host/render_process_host.h" 190 #include "content/browser/renderer_host/render_process_host.h"
190 #include "content/common/child_process_info.h" 191 #include "content/common/child_process_info.h"
191 #include "content/common/notification_service.h" 192 #include "content/common/notification_service.h"
192 #include "webkit/plugins/npapi/plugin_list.h" 193 #include "webkit/plugins/npapi/plugin_list.h"
193 #include "webkit/plugins/npapi/webplugininfo.h" 194 #include "webkit/plugins/npapi/webplugininfo.h"
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 } 527 }
527 528
528 bool MetricsService::reporting_active() const { 529 bool MetricsService::reporting_active() const {
529 DCHECK(IsSingleThreaded()); 530 DCHECK(IsSingleThreaded());
530 return reporting_active_; 531 return reporting_active_;
531 } 532 }
532 533
533 // static 534 // static
534 void MetricsService::SetUpNotifications(NotificationRegistrar* registrar, 535 void MetricsService::SetUpNotifications(NotificationRegistrar* registrar,
535 NotificationObserver* observer) { 536 NotificationObserver* observer) {
536 registrar->Add(observer, NotificationType::BROWSER_OPENED, 537 registrar->Add(observer, chrome::NOTIFICATION_BROWSER_OPENED,
537 NotificationService::AllSources()); 538 NotificationService::AllSources());
538 registrar->Add(observer, NotificationType::BROWSER_CLOSED, 539 registrar->Add(observer, chrome::NOTIFICATION_BROWSER_CLOSED,
539 NotificationService::AllSources()); 540 NotificationService::AllSources());
540 registrar->Add(observer, NotificationType::USER_ACTION, 541 registrar->Add(observer, content::NOTIFICATION_USER_ACTION,
541 NotificationService::AllSources()); 542 NotificationService::AllSources());
542 registrar->Add(observer, NotificationType::TAB_PARENTED, 543 registrar->Add(observer, content::NOTIFICATION_TAB_PARENTED,
543 NotificationService::AllSources()); 544 NotificationService::AllSources());
544 registrar->Add(observer, NotificationType::TAB_CLOSING, 545 registrar->Add(observer, content::NOTIFICATION_TAB_CLOSING,
545 NotificationService::AllSources()); 546 NotificationService::AllSources());
546 registrar->Add(observer, NotificationType::LOAD_START, 547 registrar->Add(observer, content::NOTIFICATION_LOAD_START,
547 NotificationService::AllSources()); 548 NotificationService::AllSources());
548 registrar->Add(observer, NotificationType::LOAD_STOP, 549 registrar->Add(observer, content::NOTIFICATION_LOAD_STOP,
549 NotificationService::AllSources()); 550 NotificationService::AllSources());
550 registrar->Add(observer, NotificationType::RENDERER_PROCESS_CLOSED, 551 registrar->Add(observer, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
551 NotificationService::AllSources()); 552 NotificationService::AllSources());
552 registrar->Add(observer, NotificationType::RENDERER_PROCESS_HANG, 553 registrar->Add(observer, content::NOTIFICATION_RENDERER_PROCESS_HANG,
553 NotificationService::AllSources()); 554 NotificationService::AllSources());
554 registrar->Add(observer, NotificationType::CHILD_PROCESS_HOST_CONNECTED, 555 registrar->Add(observer, content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED,
555 NotificationService::AllSources()); 556 NotificationService::AllSources());
556 registrar->Add(observer, NotificationType::CHILD_INSTANCE_CREATED, 557 registrar->Add(observer, content::NOTIFICATION_CHILD_INSTANCE_CREATED,
557 NotificationService::AllSources()); 558 NotificationService::AllSources());
558 registrar->Add(observer, NotificationType::CHILD_PROCESS_CRASHED, 559 registrar->Add(observer, content::NOTIFICATION_CHILD_PROCESS_CRASHED,
559 NotificationService::AllSources()); 560 NotificationService::AllSources());
560 registrar->Add(observer, NotificationType::TEMPLATE_URL_SERVICE_LOADED, 561 registrar->Add(observer, chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED,
561 NotificationService::AllSources()); 562 NotificationService::AllSources());
562 registrar->Add(observer, NotificationType::OMNIBOX_OPENED_URL, 563 registrar->Add(observer, chrome::NOTIFICATION_OMNIBOX_OPENED_URL,
563 NotificationService::AllSources()); 564 NotificationService::AllSources());
564 registrar->Add(observer, NotificationType::BOOKMARK_MODEL_LOADED, 565 registrar->Add(observer, chrome::NOTIFICATION_BOOKMARK_MODEL_LOADED,
565 NotificationService::AllSources()); 566 NotificationService::AllSources());
566 } 567 }
567 568
568 void MetricsService::Observe(NotificationType type, 569 void MetricsService::Observe(int type,
569 const NotificationSource& source, 570 const NotificationSource& source,
570 const NotificationDetails& details) { 571 const NotificationDetails& details) {
571 DCHECK(current_log_); 572 DCHECK(current_log_);
572 DCHECK(IsSingleThreaded()); 573 DCHECK(IsSingleThreaded());
573 574
574 if (!CanLogNotification(type, source, details)) 575 if (!CanLogNotification(type, source, details))
575 return; 576 return;
576 577
577 switch (type.value) { 578 switch (type) {
578 case NotificationType::USER_ACTION: 579 case content::NOTIFICATION_USER_ACTION:
579 current_log_->RecordUserAction(*Details<const char*>(details).ptr()); 580 current_log_->RecordUserAction(*Details<const char*>(details).ptr());
580 break; 581 break;
581 582
582 case NotificationType::BROWSER_OPENED: 583 case chrome::NOTIFICATION_BROWSER_OPENED:
583 case NotificationType::BROWSER_CLOSED: 584 case chrome::NOTIFICATION_BROWSER_CLOSED:
584 LogWindowChange(type, source, details); 585 LogWindowChange(type, source, details);
585 break; 586 break;
586 587
587 case NotificationType::TAB_PARENTED: 588 case content::NOTIFICATION_TAB_PARENTED:
588 case NotificationType::TAB_CLOSING: 589 case content::NOTIFICATION_TAB_CLOSING:
589 LogWindowChange(type, source, details); 590 LogWindowChange(type, source, details);
590 break; 591 break;
591 592
592 case NotificationType::LOAD_STOP: 593 case content::NOTIFICATION_LOAD_STOP:
593 LogLoadComplete(type, source, details); 594 LogLoadComplete(type, source, details);
594 break; 595 break;
595 596
596 case NotificationType::LOAD_START: 597 case content::NOTIFICATION_LOAD_START:
597 LogLoadStarted(); 598 LogLoadStarted();
598 break; 599 break;
599 600
600 case NotificationType::RENDERER_PROCESS_CLOSED: { 601 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: {
601 RenderProcessHost::RendererClosedDetails* process_details = 602 RenderProcessHost::RendererClosedDetails* process_details =
602 Details<RenderProcessHost::RendererClosedDetails>(details).ptr(); 603 Details<RenderProcessHost::RendererClosedDetails>(details).ptr();
603 if (process_details->status == 604 if (process_details->status ==
604 base::TERMINATION_STATUS_PROCESS_CRASHED || 605 base::TERMINATION_STATUS_PROCESS_CRASHED ||
605 process_details->status == 606 process_details->status ==
606 base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { 607 base::TERMINATION_STATUS_ABNORMAL_TERMINATION) {
607 if (process_details->was_extension_renderer) { 608 if (process_details->was_extension_renderer) {
608 LogExtensionRendererCrash(); 609 LogExtensionRendererCrash();
609 } else { 610 } else {
610 LogRendererCrash(); 611 LogRendererCrash();
611 } 612 }
612 } 613 }
613 } 614 }
614 break; 615 break;
615 616
616 case NotificationType::RENDERER_PROCESS_HANG: 617 case content::NOTIFICATION_RENDERER_PROCESS_HANG:
617 LogRendererHang(); 618 LogRendererHang();
618 break; 619 break;
619 620
620 case NotificationType::CHILD_PROCESS_HOST_CONNECTED: 621 case content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED:
621 case NotificationType::CHILD_PROCESS_CRASHED: 622 case content::NOTIFICATION_CHILD_PROCESS_CRASHED:
622 case NotificationType::CHILD_INSTANCE_CREATED: 623 case content::NOTIFICATION_CHILD_INSTANCE_CREATED:
623 LogChildProcessChange(type, source, details); 624 LogChildProcessChange(type, source, details);
624 break; 625 break;
625 626
626 case NotificationType::TEMPLATE_URL_SERVICE_LOADED: 627 case chrome::NOTIFICATION_TEMPLATE_URL_SERVICE_LOADED:
627 LogKeywords(Source<TemplateURLService>(source).ptr()); 628 LogKeywords(Source<TemplateURLService>(source).ptr());
628 break; 629 break;
629 630
630 case NotificationType::OMNIBOX_OPENED_URL: { 631 case chrome::NOTIFICATION_OMNIBOX_OPENED_URL: {
631 MetricsLog* current_log = current_log_->AsMetricsLog(); 632 MetricsLog* current_log = current_log_->AsMetricsLog();
632 DCHECK(current_log); 633 DCHECK(current_log);
633 current_log->RecordOmniboxOpenedURL( 634 current_log->RecordOmniboxOpenedURL(
634 *Details<AutocompleteLog>(details).ptr()); 635 *Details<AutocompleteLog>(details).ptr());
635 break; 636 break;
636 } 637 }
637 638
638 case NotificationType::BOOKMARK_MODEL_LOADED: { 639 case chrome::NOTIFICATION_BOOKMARK_MODEL_LOADED: {
639 Profile* p = Source<Profile>(source).ptr(); 640 Profile* p = Source<Profile>(source).ptr();
640 if (p) 641 if (p)
641 LogBookmarks(p->GetBookmarkModel()); 642 LogBookmarks(p->GetBookmarkModel());
642 break; 643 break;
643 } 644 }
644 default: 645 default:
645 NOTREACHED(); 646 NOTREACHED();
646 break; 647 break;
647 } 648 }
648 649
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after
1377 VLOG(1) << "Verify your metrics logs are formatted correctly. Verify server " 1378 VLOG(1) << "Verify your metrics logs are formatted correctly. Verify server "
1378 "is active at " << server_url_; 1379 "is active at " << server_url_;
1379 if (!pending_log()) { 1380 if (!pending_log()) {
1380 VLOG(1) << "METRICS: Recorder shutdown during log transmission."; 1381 VLOG(1) << "METRICS: Recorder shutdown during log transmission.";
1381 } else { 1382 } else {
1382 VLOG(1) << "METRICS: transmission retry being scheduled for " 1383 VLOG(1) << "METRICS: transmission retry being scheduled for "
1383 << compressed_log_; 1384 << compressed_log_;
1384 } 1385 }
1385 } 1386 }
1386 1387
1387 void MetricsService::LogWindowChange(NotificationType type, 1388 void MetricsService::LogWindowChange(int type,
1388 const NotificationSource& source, 1389 const NotificationSource& source,
1389 const NotificationDetails& details) { 1390 const NotificationDetails& details) {
1390 int controller_id = -1; 1391 int controller_id = -1;
1391 uintptr_t window_or_tab = source.map_key(); 1392 uintptr_t window_or_tab = source.map_key();
1392 MetricsLog::WindowEventType window_type; 1393 MetricsLog::WindowEventType window_type;
1393 1394
1394 // Note: since we stop all logging when a single OTR session is active, it is 1395 // Note: since we stop all logging when a single OTR session is active, it is
1395 // possible that we start getting notifications about a window that we don't 1396 // possible that we start getting notifications about a window that we don't
1396 // know about. 1397 // know about.
1397 if (window_map_.find(window_or_tab) == window_map_.end()) { 1398 if (window_map_.find(window_or_tab) == window_map_.end()) {
1398 controller_id = next_window_id_++; 1399 controller_id = next_window_id_++;
1399 window_map_[window_or_tab] = controller_id; 1400 window_map_[window_or_tab] = controller_id;
1400 } else { 1401 } else {
1401 controller_id = window_map_[window_or_tab]; 1402 controller_id = window_map_[window_or_tab];
1402 } 1403 }
1403 DCHECK_NE(controller_id, -1); 1404 DCHECK_NE(controller_id, -1);
1404 1405
1405 switch (type.value) { 1406 switch (type) {
1406 case NotificationType::TAB_PARENTED: 1407 case content::NOTIFICATION_TAB_PARENTED:
1407 case NotificationType::BROWSER_OPENED: 1408 case chrome::NOTIFICATION_BROWSER_OPENED:
1408 window_type = MetricsLog::WINDOW_CREATE; 1409 window_type = MetricsLog::WINDOW_CREATE;
1409 break; 1410 break;
1410 1411
1411 case NotificationType::TAB_CLOSING: 1412 case content::NOTIFICATION_TAB_CLOSING:
1412 case NotificationType::BROWSER_CLOSED: 1413 case chrome::NOTIFICATION_BROWSER_CLOSED:
1413 window_map_.erase(window_map_.find(window_or_tab)); 1414 window_map_.erase(window_map_.find(window_or_tab));
1414 window_type = MetricsLog::WINDOW_DESTROY; 1415 window_type = MetricsLog::WINDOW_DESTROY;
1415 break; 1416 break;
1416 1417
1417 default: 1418 default:
1418 NOTREACHED(); 1419 NOTREACHED();
1419 return; 1420 return;
1420 } 1421 }
1421 1422
1422 // TODO(brettw) we should have some kind of ID for the parent. 1423 // TODO(brettw) we should have some kind of ID for the parent.
1423 current_log_->RecordWindowEvent(window_type, controller_id, 0); 1424 current_log_->RecordWindowEvent(window_type, controller_id, 0);
1424 } 1425 }
1425 1426
1426 void MetricsService::LogLoadComplete(NotificationType type, 1427 void MetricsService::LogLoadComplete(int type,
1427 const NotificationSource& source, 1428 const NotificationSource& source,
1428 const NotificationDetails& details) { 1429 const NotificationDetails& details) {
1429 if (details == NotificationService::NoDetails()) 1430 if (details == NotificationService::NoDetails())
1430 return; 1431 return;
1431 1432
1432 // TODO(jar): There is a bug causing this to be called too many times, and 1433 // TODO(jar): There is a bug causing this to be called too many times, and
1433 // the log overflows. For now, we won't record these events. 1434 // the log overflows. For now, we won't record these events.
1434 UMA_HISTOGRAM_COUNTS("UMA.LogLoadComplete called", 1); 1435 UMA_HISTOGRAM_COUNTS("UMA.LogLoadComplete called", 1);
1435 return; 1436 return;
1436 1437
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1490 IncrementPrefValue(prefs::kStabilitySystemUncleanShutdownCount); 1491 IncrementPrefValue(prefs::kStabilitySystemUncleanShutdownCount);
1491 else 1492 else
1492 NOTREACHED() << "Unexpected Chrome OS crash type " << crash_type; 1493 NOTREACHED() << "Unexpected Chrome OS crash type " << crash_type;
1493 // Wake up metrics logs sending if necessary now that new 1494 // Wake up metrics logs sending if necessary now that new
1494 // log data is available. 1495 // log data is available.
1495 HandleIdleSinceLastTransmission(false); 1496 HandleIdleSinceLastTransmission(false);
1496 } 1497 }
1497 #endif // OS_CHROMEOS 1498 #endif // OS_CHROMEOS
1498 1499
1499 void MetricsService::LogChildProcessChange( 1500 void MetricsService::LogChildProcessChange(
1500 NotificationType type, 1501 int type,
1501 const NotificationSource& source, 1502 const NotificationSource& source,
1502 const NotificationDetails& details) { 1503 const NotificationDetails& details) {
1503 Details<ChildProcessInfo> child_details(details); 1504 Details<ChildProcessInfo> child_details(details);
1504 const std::wstring& child_name = child_details->name(); 1505 const std::wstring& child_name = child_details->name();
1505 1506
1506 if (child_process_stats_buffer_.find(child_name) == 1507 if (child_process_stats_buffer_.find(child_name) ==
1507 child_process_stats_buffer_.end()) { 1508 child_process_stats_buffer_.end()) {
1508 child_process_stats_buffer_[child_name] = 1509 child_process_stats_buffer_[child_name] =
1509 ChildProcessStats(child_details->type()); 1510 ChildProcessStats(child_details->type());
1510 } 1511 }
1511 1512
1512 ChildProcessStats& stats = child_process_stats_buffer_[child_name]; 1513 ChildProcessStats& stats = child_process_stats_buffer_[child_name];
1513 switch (type.value) { 1514 switch (type) {
1514 case NotificationType::CHILD_PROCESS_HOST_CONNECTED: 1515 case content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED:
1515 stats.process_launches++; 1516 stats.process_launches++;
1516 break; 1517 break;
1517 1518
1518 case NotificationType::CHILD_INSTANCE_CREATED: 1519 case content::NOTIFICATION_CHILD_INSTANCE_CREATED:
1519 stats.instances++; 1520 stats.instances++;
1520 break; 1521 break;
1521 1522
1522 case NotificationType::CHILD_PROCESS_CRASHED: 1523 case content::NOTIFICATION_CHILD_PROCESS_CRASHED:
1523 stats.process_crashes++; 1524 stats.process_crashes++;
1524 // Exclude plugin crashes from the count below because we report them via 1525 // Exclude plugin crashes from the count below because we report them via
1525 // a separate UMA metric. 1526 // a separate UMA metric.
1526 if (child_details->type() != ChildProcessInfo::PLUGIN_PROCESS) { 1527 if (child_details->type() != ChildProcessInfo::PLUGIN_PROCESS) {
1527 IncrementPrefValue(prefs::kStabilityChildProcessCrashCount); 1528 IncrementPrefValue(prefs::kStabilityChildProcessCrashCount);
1528 } 1529 }
1529 break; 1530 break;
1530 1531
1531 default: 1532 default:
1532 NOTREACHED() << "Unexpected notification type " << type.value; 1533 NOTREACHED() << "Unexpected notification type " << type;
1533 return; 1534 return;
1534 } 1535 }
1535 } 1536 }
1536 1537
1537 // Recursively counts the number of bookmarks and folders in node. 1538 // Recursively counts the number of bookmarks and folders in node.
1538 static void CountBookmarks(const BookmarkNode* node, 1539 static void CountBookmarks(const BookmarkNode* node,
1539 int* bookmarks, 1540 int* bookmarks,
1540 int* folders) { 1541 int* folders) {
1541 if (node->is_url()) 1542 if (node->is_url())
1542 (*bookmarks)++; 1543 (*bookmarks)++;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1652 stats.process_launches); 1653 stats.process_launches);
1653 plugin_dict->SetInteger(prefs::kStabilityPluginCrashes, 1654 plugin_dict->SetInteger(prefs::kStabilityPluginCrashes,
1654 stats.process_crashes); 1655 stats.process_crashes);
1655 plugin_dict->SetInteger(prefs::kStabilityPluginInstances, 1656 plugin_dict->SetInteger(prefs::kStabilityPluginInstances,
1656 stats.instances); 1657 stats.instances);
1657 plugins->Append(plugin_dict); 1658 plugins->Append(plugin_dict);
1658 } 1659 }
1659 child_process_stats_buffer_.clear(); 1660 child_process_stats_buffer_.clear();
1660 } 1661 }
1661 1662
1662 bool MetricsService::CanLogNotification(NotificationType type, 1663 bool MetricsService::CanLogNotification(int type,
1663 const NotificationSource& source, 1664 const NotificationSource& source,
1664 const NotificationDetails& details) { 1665 const NotificationDetails& details) {
1665 // We simply don't log anything to UMA if there is a single incognito 1666 // We simply don't log anything to UMA if there is a single incognito
1666 // session visible. The problem is that we always notify using the orginal 1667 // session visible. The problem is that we always notify using the orginal
1667 // profile in order to simplify notification processing. 1668 // profile in order to simplify notification processing.
1668 return !BrowserList::IsOffTheRecordSessionActive(); 1669 return !BrowserList::IsOffTheRecordSessionActive();
1669 } 1670 }
1670 1671
1671 void MetricsService::RecordBooleanPrefValue(const char* path, bool value) { 1672 void MetricsService::RecordBooleanPrefValue(const char* path, bool value) {
1672 DCHECK(IsSingleThreaded()); 1673 DCHECK(IsSingleThreaded());
(...skipping 17 matching lines...) Expand all
1690 thread_id = base::PlatformThread::CurrentId(); 1691 thread_id = base::PlatformThread::CurrentId();
1691 return base::PlatformThread::CurrentId() == thread_id; 1692 return base::PlatformThread::CurrentId() == thread_id;
1692 } 1693 }
1693 1694
1694 #if defined(OS_CHROMEOS) 1695 #if defined(OS_CHROMEOS)
1695 void MetricsService::StartExternalMetrics() { 1696 void MetricsService::StartExternalMetrics() {
1696 external_metrics_ = new chromeos::ExternalMetrics; 1697 external_metrics_ = new chromeos::ExternalMetrics;
1697 external_metrics_->Start(); 1698 external_metrics_->Start();
1698 } 1699 }
1699 #endif 1700 #endif
OLDNEW
« no previous file with comments | « chrome/browser/metrics/metrics_service.h ('k') | chrome/browser/metrics/thread_watcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698