Commit b2a9bbd4 authored by jar@chromium.org's avatar jar@chromium.org

Enable tracking of objects by default

This is a reland of accumulated patches including CLs
8414036, 8425010, 8425013, 8424013.

It fully enables tracking of objects, as seen in about:tracking
in teh release build.

The problem this had in its initaial landing centered on
Mac instability in base_unittest.  We were encountering crash
on exit of the tests, with a stack dump involving pthreads.


r=rtenneti
BUG=101856
Review URL: http://codereview.chromium.org/8429009

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@108026 0039d316-1c4b-4281-b951-d872f2087c98
parent daf82f8e
...@@ -336,6 +336,8 @@ ...@@ -336,6 +336,8 @@
'timer.h', 'timer.h',
'tracked_objects.cc', 'tracked_objects.cc',
'tracked_objects.h', 'tracked_objects.h',
'tracking_info.cc',
'tracking_info.h',
'tuple.h', 'tuple.h',
'utf_offset_string_conversions.cc', 'utf_offset_string_conversions.cc',
'utf_offset_string_conversions.h', 'utf_offset_string_conversions.h',
......
...@@ -10,12 +10,6 @@ ...@@ -10,12 +10,6 @@
#include "base/base_export.h" #include "base/base_export.h"
#include "base/values.h" #include "base/values.h"
#ifndef NDEBUG
#ifndef TRACK_ALL_TASK_OBJECTS
#define TRACK_ALL_TASK_OBJECTS
#endif // TRACK_ALL_TASK_OBJECTS
#endif // NDEBUG
namespace tracked_objects { namespace tracked_objects {
// Location provides basic info where of an object was constructed, or was // Location provides basic info where of an object was constructed, or was
......
...@@ -486,20 +486,16 @@ void MessageLoop::RunTask(const PendingTask& pending_task) { ...@@ -486,20 +486,16 @@ void MessageLoop::RunTask(const PendingTask& pending_task) {
HistogramEvent(kTaskRunEvent); HistogramEvent(kTaskRunEvent);
#if defined(TRACK_ALL_TASK_OBJECTS) tracked_objects::TrackedTime start_time = tracked_objects::ThreadData::Now();
TimeTicks start_of_run = tracked_objects::ThreadData::Now();
#endif // defined(TRACK_ALL_TASK_OBJECTS)
FOR_EACH_OBSERVER(TaskObserver, task_observers_, FOR_EACH_OBSERVER(TaskObserver, task_observers_,
WillProcessTask(pending_task.time_posted)); WillProcessTask(pending_task.time_posted));
pending_task.task.Run(); pending_task.task.Run();
FOR_EACH_OBSERVER(TaskObserver, task_observers_, FOR_EACH_OBSERVER(TaskObserver, task_observers_,
DidProcessTask(pending_task.time_posted)); DidProcessTask(pending_task.time_posted));
#if defined(TRACK_ALL_TASK_OBJECTS)
tracked_objects::ThreadData::TallyADeathIfActive(pending_task.post_births, tracked_objects::ThreadData::TallyRunOnNamedThreadIfTracking(pending_task,
pending_task.time_posted, pending_task.delayed_run_time, start_of_run, start_time, tracked_objects::ThreadData::Now());
tracked_objects::ThreadData::Now());
#endif // defined(TRACK_ALL_TASK_OBJECTS)
nestable_tasks_allowed_ = true; nestable_tasks_allowed_ = true;
} }
...@@ -779,15 +775,11 @@ MessageLoop::PendingTask::PendingTask( ...@@ -779,15 +775,11 @@ MessageLoop::PendingTask::PendingTask(
const tracked_objects::Location& posted_from, const tracked_objects::Location& posted_from,
TimeTicks delayed_run_time, TimeTicks delayed_run_time,
bool nestable) bool nestable)
: task(task), : base::TrackingInfo(posted_from, delayed_run_time),
time_posted(TimeTicks::Now()), task(task),
delayed_run_time(delayed_run_time),
posted_from(posted_from), posted_from(posted_from),
sequence_num(0), sequence_num(0),
nestable(nestable) { nestable(nestable) {
#if defined(TRACK_ALL_TASK_OBJECTS)
post_births = tracked_objects::ThreadData::TallyABirthIfActive(posted_from);
#endif // defined(TRACK_ALL_TASK_OBJECTS)
} }
MessageLoop::PendingTask::~PendingTask() { MessageLoop::PendingTask::~PendingTask() {
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "base/observer_list.h" #include "base/observer_list.h"
#include "base/synchronization/lock.h" #include "base/synchronization/lock.h"
#include "base/task.h" #include "base/task.h"
#include "base/tracking_info.h"
#include "base/time.h" #include "base/time.h"
#if defined(OS_WIN) #if defined(OS_WIN)
...@@ -44,11 +45,9 @@ namespace base { ...@@ -44,11 +45,9 @@ namespace base {
class Histogram; class Histogram;
} }
#if defined(TRACK_ALL_TASK_OBJECTS)
namespace tracked_objects { namespace tracked_objects {
class Births; class Births;
} }
#endif // defined(TRACK_ALL_TASK_OBJECTS)
// A MessageLoop is used to process events for a particular thread. There is // A MessageLoop is used to process events for a particular thread. There is
// at most one MessageLoop instance per thread. // at most one MessageLoop instance per thread.
...@@ -410,7 +409,7 @@ class BASE_EXPORT MessageLoop : public base::MessagePump::Delegate { ...@@ -410,7 +409,7 @@ class BASE_EXPORT MessageLoop : public base::MessagePump::Delegate {
#endif #endif
// This structure is copied around by value. // This structure is copied around by value.
struct PendingTask { struct PendingTask : public base::TrackingInfo {
PendingTask(const base::Closure& task, PendingTask(const base::Closure& task,
const tracked_objects::Location& posted_from, const tracked_objects::Location& posted_from,
base::TimeTicks delayed_run_time, base::TimeTicks delayed_run_time,
...@@ -423,17 +422,6 @@ class BASE_EXPORT MessageLoop : public base::MessagePump::Delegate { ...@@ -423,17 +422,6 @@ class BASE_EXPORT MessageLoop : public base::MessagePump::Delegate {
// The task to run. // The task to run.
base::Closure task; base::Closure task;
#if defined(TRACK_ALL_TASK_OBJECTS)
// Counter for location where the Closure was posted from.
tracked_objects::Births* post_births;
#endif // defined(TRACK_ALL_TASK_OBJECTS)
// Time this PendingTask was posted.
base::TimeTicks time_posted;
// The time when the task should be run.
base::TimeTicks delayed_run_time;
// The site this PendingTask was posted from. // The site this PendingTask was posted from.
tracked_objects::Location posted_from; tracked_objects::Location posted_from;
......
...@@ -152,9 +152,7 @@ void Thread::ThreadMain() { ...@@ -152,9 +152,7 @@ void Thread::ThreadMain() {
ANNOTATE_THREAD_NAME(name_.c_str()); // Tell the name to race detector. ANNOTATE_THREAD_NAME(name_.c_str()); // Tell the name to race detector.
message_loop.set_thread_name(name_); message_loop.set_thread_name(name_);
message_loop_ = &message_loop; message_loop_ = &message_loop;
#if defined(TRACK_ALL_TASK_OBJECTS)
tracked_objects::ThreadData::InitializeThreadContext(name_); tracked_objects::ThreadData::InitializeThreadContext(name_);
#endif // TRACK_ALL_TASK_OBJECTS
// Let the thread do extra initialization. // Let the thread do extra initialization.
// Let's do this before signaling we are started. // Let's do this before signaling we are started.
......
...@@ -88,15 +88,14 @@ void WorkerThread::ThreadMain() { ...@@ -88,15 +88,14 @@ void WorkerThread::ThreadMain() {
"src_file", pending_task.posted_from.file_name(), "src_file", pending_task.posted_from.file_name(),
"src_func", pending_task.posted_from.function_name()); "src_func", pending_task.posted_from.function_name());
#if defined(TRACK_ALL_TASK_OBJECTS) tracked_objects::TrackedTime start_time =
TimeTicks start_of_run = tracked_objects::ThreadData::Now(); tracked_objects::ThreadData::Now();
#endif // defined(TRACK_ALL_TASK_OBJECTS)
pending_task.task.Run(); pending_task.task.Run();
#if defined(TRACK_ALL_TASK_OBJECTS)
tracked_objects::ThreadData::TallyADeathIfActive(pending_task.post_births, tracked_objects::ThreadData::TallyRunOnWorkerThreadIfTracking(
pending_task.time_posted, TimeTicks(), start_of_run, pending_task.birth_tally, pending_task.time_posted,
tracked_objects::ThreadData::Now()); start_time, tracked_objects::ThreadData::Now());
#endif // defined(TRACK_ALL_TASK_OBJECTS)
} }
// The WorkerThread is non-joinable, so it deletes itself. // The WorkerThread is non-joinable, so it deletes itself.
...@@ -122,10 +121,8 @@ PosixDynamicThreadPool::PendingTask::PendingTask( ...@@ -122,10 +121,8 @@ PosixDynamicThreadPool::PendingTask::PendingTask(
const base::Closure& task) const base::Closure& task)
: posted_from(posted_from), : posted_from(posted_from),
task(task) { task(task) {
#if defined(TRACK_ALL_TASK_OBJECTS) birth_tally = tracked_objects::ThreadData::TallyABirthIfActive(posted_from);
post_births = tracked_objects::ThreadData::TallyABirthIfActive(posted_from);
time_posted = tracked_objects::ThreadData::Now(); time_posted = tracked_objects::ThreadData::Now();
#endif // defined(TRACK_ALL_TASK_OBJECTS)
} }
PosixDynamicThreadPool::PendingTask::~PendingTask() { PosixDynamicThreadPool::PendingTask::~PendingTask() {
......
...@@ -53,13 +53,11 @@ class BASE_EXPORT PosixDynamicThreadPool ...@@ -53,13 +53,11 @@ class BASE_EXPORT PosixDynamicThreadPool
const base::Closure& task); const base::Closure& task);
~PendingTask(); ~PendingTask();
#if defined(TRACK_ALL_TASK_OBJECTS)
// Counter for location where the Closure was posted from. // Counter for location where the Closure was posted from.
tracked_objects::Births* post_births; tracked_objects::Births* birth_tally;
// Time the task was posted. // Time the task was posted.
TimeTicks time_posted; tracked_objects::TrackedTime time_posted;
#endif // defined(TRACK_ALL_TASK_OBJECTS)
const tracked_objects::Location posted_from; const tracked_objects::Location posted_from;
......
...@@ -20,19 +20,15 @@ struct PendingTask { ...@@ -20,19 +20,15 @@ struct PendingTask {
const base::Closure& task) const base::Closure& task)
: posted_from(posted_from), : posted_from(posted_from),
task(task) { task(task) {
#if defined(TRACK_ALL_TASK_OBJECTS) birth_tally = tracked_objects::ThreadData::TallyABirthIfActive(posted_from);
post_births = tracked_objects::ThreadData::TallyABirthIfActive(posted_from);
time_posted = tracked_objects::ThreadData::Now(); time_posted = tracked_objects::ThreadData::Now();
#endif // defined(TRACK_ALL_TASK_OBJECTS)
} }
#if defined(TRACK_ALL_TASK_OBJECTS)
// Counter for location where the Closure was posted from. // Counter for location where the Closure was posted from.
tracked_objects::Births* post_births; tracked_objects::Births* birth_tally;
// Time the task was posted. // Time the task was posted.
TimeTicks time_posted; tracked_objects::TrackedTime time_posted;
#endif // defined(TRACK_ALL_TASK_OBJECTS)
// The site this PendingTask was posted from. // The site this PendingTask was posted from.
tracked_objects::Location posted_from; tracked_objects::Location posted_from;
...@@ -47,15 +43,13 @@ DWORD CALLBACK WorkItemCallback(void* param) { ...@@ -47,15 +43,13 @@ DWORD CALLBACK WorkItemCallback(void* param) {
"src_file", pending_task->posted_from.file_name(), "src_file", pending_task->posted_from.file_name(),
"src_func", pending_task->posted_from.function_name()); "src_func", pending_task->posted_from.function_name());
#if defined(TRACK_ALL_TASK_OBJECTS) tracked_objects::TrackedTime start_time = tracked_objects::ThreadData::Now();
TimeTicks start_of_run = tracked_objects::ThreadData::Now();
#endif // defined(TRACK_ALL_TASK_OBJECTS)
pending_task->task.Run(); pending_task->task.Run();
#if defined(TRACK_ALL_TASK_OBJECTS)
tracked_objects::ThreadData::TallyADeathIfActive(pending_task->post_births, tracked_objects::ThreadData::TallyRunOnWorkerThreadIfTracking(
pending_task->time_posted, TimeTicks::TimeTicks(), start_of_run, pending_task->birth_tally, pending_task->time_posted,
tracked_objects::ThreadData::Now()); start_time, tracked_objects::ThreadData::Now());
#endif // defined(TRACK_ALL_TASK_OBJECTS)
delete pending_task; delete pending_task;
return 0; return 0;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/tracking_info.h"
#include "base/tracked_objects.h"
namespace base {
TrackingInfo::TrackingInfo(
const tracked_objects::Location& posted_from,
base::TimeTicks delayed_run_time)
: birth_tally(
tracked_objects::ThreadData::TallyABirthIfActive(posted_from)),
time_posted(TimeTicks::Now()),
delayed_run_time(delayed_run_time) {
}
TrackingInfo::~TrackingInfo() {}
} // namespace base
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This is a simple struct with tracking information that is stored
// with a PendingTask (when message_loop is handling the task).
// Only the information that is shared with the profiler in tracked_objects
// are included in this structure.
#ifndef BASE_TRACKING_INFO_H_
#define BASE_TRACKING_INFO_H_
#include "base/time.h"
namespace tracked_objects {
class Location;
class Births;
}
namespace base {
// This structure is copied around by value.
struct BASE_EXPORT TrackingInfo {
TrackingInfo(const tracked_objects::Location& posted_from,
base::TimeTicks delayed_run_time);
~TrackingInfo();
// Record of location and thread that the task came from.
tracked_objects::Births* birth_tally;
// Time when the related task was posted.
base::TimeTicks time_posted;
// The time when the task should be run.
base::TimeTicks delayed_run_time;
};
} // namespace base
#endif // BASE_TRACKING_INFO_H_
...@@ -145,11 +145,9 @@ const char* const kChromePaths[] = { ...@@ -145,11 +145,9 @@ const char* const kChromePaths[] = {
chrome::kChromeUITCMallocHost, chrome::kChromeUITCMallocHost,
chrome::kChromeUITermsHost, chrome::kChromeUITermsHost,
chrome::kChromeUITracingHost, chrome::kChromeUITracingHost,
chrome::kChromeUITrackingHost,
chrome::kChromeUIVersionHost, chrome::kChromeUIVersionHost,
chrome::kChromeUIWorkersHost, chrome::kChromeUIWorkersHost,
#if defined(TRACK_ALL_TASK_OBJECTS)
chrome::kChromeUITrackingHost,
#endif
#if defined(OS_WIN) #if defined(OS_WIN)
chrome::kChromeUIConflictsHost, chrome::kChromeUIConflictsHost,
#endif #endif
...@@ -184,10 +182,8 @@ const char* const kAboutSourceNames[] = { ...@@ -184,10 +182,8 @@ const char* const kAboutSourceNames[] = {
chrome::kChromeUIStatsHost, chrome::kChromeUIStatsHost,
chrome::kChromeUITaskManagerHost, chrome::kChromeUITaskManagerHost,
chrome::kChromeUITermsHost, chrome::kChromeUITermsHost,
chrome::kChromeUIVersionHost,
#if defined(TRACK_ALL_TASK_OBJECTS)
chrome::kChromeUITrackingHost, chrome::kChromeUITrackingHost,
#endif chrome::kChromeUIVersionHost,
#if defined(USE_TCMALLOC) #if defined(USE_TCMALLOC)
chrome::kChromeUITCMallocHost, chrome::kChromeUITCMallocHost,
#endif #endif
...@@ -889,7 +885,6 @@ void AboutMemory(const std::string& path, AboutSource* source, int request_id) { ...@@ -889,7 +885,6 @@ void AboutMemory(const std::string& path, AboutSource* source, int request_id) {
} }
} }
#if defined(TRACK_ALL_TASK_OBJECTS)
static std::string AboutTracking(const std::string& query) { static std::string AboutTracking(const std::string& query) {
std::string unescaped_title("About Tracking"); std::string unescaped_title("About Tracking");
if (!query.empty()) { if (!query.empty()) {
...@@ -903,7 +898,6 @@ static std::string AboutTracking(const std::string& query) { ...@@ -903,7 +898,6 @@ static std::string AboutTracking(const std::string& query) {
AppendFooter(&data); AppendFooter(&data);
return data; return data;
} }
#endif // TRACK_ALL_TASK_OBJECTS
// Handler for filling in the "about:stats" page, as called by the browser's // Handler for filling in the "about:stats" page, as called by the browser's
// About handler processing. // About handler processing.
...@@ -1474,10 +1468,8 @@ void AboutSource::StartDataRequest(const std::string& path, ...@@ -1474,10 +1468,8 @@ void AboutSource::StartDataRequest(const std::string& path,
#endif #endif
} else if (host == chrome::kChromeUIStatsHost) { } else if (host == chrome::kChromeUIStatsHost) {
response = AboutStats(path); response = AboutStats(path);
#if defined(TRACK_ALL_TASK_OBJECTS)
} else if (host == chrome::kChromeUITrackingHost) { } else if (host == chrome::kChromeUITrackingHost) {
response = AboutTracking(path); response = AboutTracking(path);
#endif
#if defined(USE_TCMALLOC) #if defined(USE_TCMALLOC)
} else if (host == chrome::kChromeUITCMallocHost) { } else if (host == chrome::kChromeUITCMallocHost) {
response = AboutTcmalloc(); response = AboutTcmalloc();
......
...@@ -1223,6 +1223,14 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() { ...@@ -1223,6 +1223,14 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
browser_process_.reset(new BrowserProcessImpl(parsed_command_line())); browser_process_.reset(new BrowserProcessImpl(parsed_command_line()));
} }
if (parsed_command_line().HasSwitch(switches::kEnableTracking)) {
// User wants to override default tracking status.
std::string flag =
parsed_command_line().GetSwitchValueASCII(switches::kEnableTracking);
bool enabled = flag.compare("0") != 0;
tracked_objects::ThreadData::InitializeAndSetTrackingStatus(enabled);
}
// This forces the TabCloseableStateWatcher to be created and, on chromeos, // This forces the TabCloseableStateWatcher to be created and, on chromeos,
// register for the notifications it needs to track the closeable state of // register for the notifications it needs to track the closeable state of
// tabs. // tabs.
......
...@@ -122,12 +122,10 @@ class ChromeBrowserMainParts : public content::BrowserMainParts { ...@@ -122,12 +122,10 @@ class ChromeBrowserMainParts : public content::BrowserMainParts {
// it is destroyed last. // it is destroyed last.
scoped_ptr<ShutdownWatcherHelper> shutdown_watcher_; scoped_ptr<ShutdownWatcherHelper> shutdown_watcher_;
#if defined(TRACK_ALL_TASK_OBJECTS)
// Creating this object starts tracking the creation and deletion of Task // Creating this object starts tracking the creation and deletion of Task
// instance. This MUST be done before main_message_loop, so that it is // instance. This MUST be done before main_message_loop, so that it is
// destroyed after the main_message_loop. // destroyed after the main_message_loop.
tracked_objects::AutoTracking tracking_objects_; tracked_objects::AutoTracking tracking_objects_;
#endif
// Statistical testing infrastructure for the entire browser. NULL until // Statistical testing infrastructure for the entire browser. NULL until
// SetupMetricsAndFieldTrials is called. // SetupMetricsAndFieldTrials is called.
......
...@@ -519,6 +519,12 @@ const char kDisablePanels[] = "disable-panels"; ...@@ -519,6 +519,12 @@ const char kDisablePanels[] = "disable-panels";
// Enables speculative TCP/IP preconnection. // Enables speculative TCP/IP preconnection.
const char kEnablePreconnect[] = "enable-preconnect"; const char kEnablePreconnect[] = "enable-preconnect";
// Controls the support for SDCH filtering (dictionary based expansion of
// content). By default SDCH filtering is enabled. To disable SDCH filtering,
// use "--enable-sdch=0" as command line argument. SDCH is currently only
// supported server-side for searches on google.com.
const char kEnableSdch[] = "enable-sdch";
// Enables the IsSearchProviderInstalled and InstallSearchProvider with an // Enables the IsSearchProviderInstalled and InstallSearchProvider with an
// extra parameter to indicate if the provider should be the default. // extra parameter to indicate if the provider should be the default.
const char kEnableSearchProviderApiV2[] = "enable-search-provider-api-v2"; const char kEnableSearchProviderApiV2[] = "enable-search-provider-api-v2";
...@@ -539,21 +545,28 @@ const char kEnableSyncOAuth[] = "enable-sync-oauth"; ...@@ -539,21 +545,28 @@ const char kEnableSyncOAuth[] = "enable-sync-oauth";
const char kEnableSyncSearchEngines[] = "enable-sync-search-engines"; const char kEnableSyncSearchEngines[] = "enable-sync-search-engines";
// Enables syncing browser sessions. // Enables syncing browser sessions.
const char kEnableSyncTabs[] = "enable-sync-tabs"; const char kEnableSyncTabs[] = "enable-sync-tabs";
// Enables syncing browser sessions for other synced clients. // Enables syncing browser sessions for other synced clients.
const char kEnableSyncTabsForOtherClients[] = const char kEnableSyncTabsForOtherClients[] =
"enable-sync-tabs-for-other-clients"; "enable-sync-tabs-for-other-clients";
// Enable syncing app notifications. // Enable syncing app notifications.
const char kEnableSyncAppNotifications[] = "enable-sync-app-notifications"; const char kEnableSyncAppNotifications[] = "enable-sync-app-notifications";
// Enables context menu for selecting groups of tabs. // Enables context menu for selecting groups of tabs.
const char kEnableTabGroupsContextMenu[] = "enable-tab-groups-context-menu"; const char kEnableTabGroupsContextMenu[] = "enable-tab-groups-context-menu";
// Enables the "synced bookmarks" folder. // Enables the "synced bookmarks" folder.
const char kEnableSyncedBookmarksFolder[] = "enable-synced-bookmarks-folder"; const char kEnableSyncedBookmarksFolder[] = "enable-synced-bookmarks-folder";
// Enables tracking of tasks in profiler for viewing via about:tracking.
// To predominantly disable tracking (profiling), use the command line switch:
// --enable-tracking=0
// Some tracking will still take place at startup, but it will be turned off
// during chrome_browser_main.
const char kEnableTracking[] = "enable-tracking";
// Spawns threads to watch for excessive delays in specified message loops. // Spawns threads to watch for excessive delays in specified message loops.
// User should set breakpoints on Alarm() to examine problematic thread. // User should set breakpoints on Alarm() to examine problematic thread.
// //
...@@ -963,12 +976,6 @@ const char kSbDisableAutoUpdate[] = "safebrowsing-disable-auto-update"; ...@@ -963,12 +976,6 @@ const char kSbDisableAutoUpdate[] = "safebrowsing-disable-auto-update";
const char kSbDisableDownloadProtection[] = const char kSbDisableDownloadProtection[] =
"safebrowsing-disable-download-protection"; "safebrowsing-disable-download-protection";
// Controls the support for SDCH filtering (dictionary based expansion of
// content). By default SDCH filtering is enabled. To disable SDCH filtering,
// use "--enable-sdch=0" as command line argument. SDCH is currently only
// supported server-side for searches on google.com.
const char kEnableSdch[] = "enable-sdch";
// Enables the showing of an info-bar instructing user they can search directly // Enables the showing of an info-bar instructing user they can search directly
// from the omnibox. // from the omnibox.
const char kSearchInOmniboxHint[] = "search-in-omnibox-hint"; const char kSearchInOmniboxHint[] = "search-in-omnibox-hint";
......
...@@ -148,6 +148,7 @@ extern const char kEnableNTPBookmarkFeatures[]; ...@@ -148,6 +148,7 @@ extern const char kEnableNTPBookmarkFeatures[];
extern const char kDisablePanels[]; extern const char kDisablePanels[];
extern const char kEnablePreconnect[]; extern const char kEnablePreconnect[];
extern const char kEnableResourceContentSettings[]; extern const char kEnableResourceContentSettings[];
extern const char kEnableSdch[];
extern const char kEnableSearchProviderApiV2[]; extern const char kEnableSearchProviderApiV2[];
extern const char kEnableShortcutsProvider[]; extern const char kEnableShortcutsProvider[];
extern const char kEnableSmoothScrolling[]; extern const char kEnableSmoothScrolling[];
...@@ -160,6 +161,7 @@ extern const char kEnableSyncTabs[]; ...@@ -160,6 +161,7 @@ extern const char kEnableSyncTabs[];
extern const char kEnableSyncTabsForOtherClients[]; extern const char kEnableSyncTabsForOtherClients[];
extern const char kEnableSyncAppNotifications[]; extern const char kEnableSyncAppNotifications[];
extern const char kEnableSyncedBookmarksFolder[]; extern const char kEnableSyncedBookmarksFolder[];
extern const char kEnableTracking[];
extern const char kEnableTabGroupsContextMenu[]; extern const char kEnableTabGroupsContextMenu[];
extern const char kEnableTopSites[]; extern const char kEnableTopSites[];
extern const char kEnableWatchdog[]; extern const char kEnableWatchdog[];
...@@ -262,7 +264,6 @@ extern const char kSbInfoURLPrefix[]; ...@@ -262,7 +264,6 @@ extern const char kSbInfoURLPrefix[];
extern const char kSbMacKeyURLPrefix[]; extern const char kSbMacKeyURLPrefix[];
extern const char kSbDisableAutoUpdate[]; extern const char kSbDisableAutoUpdate[];
extern const char kSbDisableDownloadProtection[]; extern const char kSbDisableDownloadProtection[];
extern const char kEnableSdch[];
extern const char kSearchInOmniboxHint[]; extern const char kSearchInOmniboxHint[];
extern const char kServiceAccountLsid[]; extern const char kServiceAccountLsid[];
extern const char kShowAutofillTypePredictions[]; extern const char kShowAutofillTypePredictions[];
......
...@@ -292,10 +292,7 @@ void BrowserMainLoop::InitializeMainThread() { ...@@ -292,10 +292,7 @@ void BrowserMainLoop::InitializeMainThread() {
const char* kThreadName = "CrBrowserMain"; const char* kThreadName = "CrBrowserMain";
base::PlatformThread::SetName(kThreadName); base::PlatformThread::SetName(kThreadName);
main_message_loop_->set_thread_name(kThreadName); main_message_loop_->set_thread_name(kThreadName);
#if defined(TRACK_ALL_TASK_OBJECTS)
tracked_objects::ThreadData::InitializeThreadContext(kThreadName); tracked_objects::ThreadData::InitializeThreadContext(kThreadName);
#endif // TRACK_ALL_TASK_OBJECTS
// Register the main thread by instantiating it, but don't call any methods. // Register the main thread by instantiating it, but don't call any methods.
main_thread_.reset(new BrowserThreadImpl(BrowserThread::UI, main_thread_.reset(new BrowserThreadImpl(BrowserThread::UI,
......
...@@ -193,6 +193,23 @@ ...@@ -193,6 +193,23 @@
fun:base::LeakyLazyInstanceTraits::New fun:base::LeakyLazyInstanceTraits::New
fun:base::LazyInstance::Pointer fun:base::LazyInstance::Pointer
} }
{
Intentional leak in object tracking statics to avoid shutdown race
Heapcheck:Leak
...
fun:tracked_objects::ThreadData::Initialize*
}
{
Intentional leak in object tracking of thread context to avoid shutdown race
Heapcheck:Leak
fun:tracked_objects::ThreadData::Get
}
{
Intentional leak of task birth and death data to avoid shutdown race
Heapcheck:Leak
...
fun:tracked_objects::ThreadData::TallyA*
}
#----------------------------------------------------------------------- #-----------------------------------------------------------------------
......
...@@ -167,6 +167,13 @@ ...@@ -167,6 +167,13 @@
fun:base::SharedMemory::CreateNamed fun:base::SharedMemory::CreateNamed
} }
{
Benign race to access status during TrackedObject unittests
ThreadSanitizer:Race
...
fun:tracked_objects::ThreadData::ShutdownSingleThreadedCleanup
}
#----------------------------------------------------------------------- #-----------------------------------------------------------------------
# 3. Suppressions for real chromium bugs that are not yet fixed. # 3. Suppressions for real chromium bugs that are not yet fixed.
# These should all be in chromium's bug tracking system (but a few aren't yet). # These should all be in chromium's bug tracking system (but a few aren't yet).
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment