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

Unified Diff: chrome/browser/sync/glue/history_model_worker.cc

Issue 352913002: Port HistoryService::ScheduleDBTask to CancelableTaskTracker (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix lifetime of base::CancelableTaskTracker for HistoryModelWorker Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync/glue/history_model_worker.cc
diff --git a/chrome/browser/sync/glue/history_model_worker.cc b/chrome/browser/sync/glue/history_model_worker.cc
index dc63d5e1f4e2315dd3ac4dd7c8ebcd8b4bd8547e..39b86263bb3e150ef7d01df8760fa0d51a76c5e5 100644
--- a/chrome/browser/sync/glue/history_model_worker.cc
+++ b/chrome/browser/sync/glue/history_model_worker.cc
@@ -66,13 +66,13 @@ namespace {
// thread.
void PostWorkerTask(const base::WeakPtr<HistoryService>& history_service,
const syncer::WorkCallback& work,
- CancelableRequestConsumerT<int, 0>* cancelable_consumer,
+ base::CancelableTaskTracker* cancelable_tracker,
WaitableEvent* done,
syncer::SyncerError* error) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (history_service.get()) {
scoped_refptr<WorkerTask> task(new WorkerTask(work, done, error));
- history_service->ScheduleDBTask(task.get(), cancelable_consumer);
+ history_service->ScheduleDBTask(task.get(), cancelable_tracker);
} else {
*error = syncer::CANNOT_DO_WORK;
done->Signal();
@@ -87,6 +87,8 @@ HistoryModelWorker::HistoryModelWorker(
: syncer::ModelSafeWorker(observer),
history_service_(history_service) {
CHECK(history_service.get());
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ cancelable_tracker_.reset(new base::CancelableTaskTracker);
}
void HistoryModelWorker::RegisterForLoopDestruction() {
@@ -94,7 +96,7 @@ void HistoryModelWorker::RegisterForLoopDestruction() {
history_service_->ScheduleDBTask(
new AddDBThreadObserverTask(
base::Bind(&HistoryModelWorker::RegisterOnDBThread, this)),
- &cancelable_consumer_);
+ cancelable_tracker_.get());
}
void HistoryModelWorker::RegisterOnDBThread() {
@@ -105,9 +107,12 @@ void HistoryModelWorker::RegisterOnDBThread() {
syncer::SyncerError HistoryModelWorker::DoWorkAndWaitUntilDoneImpl(
const syncer::WorkCallback& work) {
syncer::SyncerError error = syncer::UNSET;
- if (BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
- base::Bind(&PostWorkerTask, history_service_,
- work, &cancelable_consumer_,
+ if (BrowserThread::PostTask(BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&PostWorkerTask,
+ history_service_,
+ work,
+ cancelable_tracker_.get(),
work_done_or_stopped(),
&error))) {
work_done_or_stopped()->Wait();
@@ -121,6 +126,11 @@ syncer::ModelSafeGroup HistoryModelWorker::GetModelSafeGroup() {
return syncer::GROUP_HISTORY;
}
-HistoryModelWorker::~HistoryModelWorker() {}
+HistoryModelWorker::~HistoryModelWorker() {
+ // The base::CancelableTaskTracker class is not thread-safe and must only be
+ // used from a single thread but the current object may not be destroyed from
+ // the UI thread, so delete it from the UI thread.
+ BrowserThread::DeleteOnUIThread::Destruct(cancelable_tracker_.release());
+}
} // namespace browser_sync
« no previous file with comments | « chrome/browser/sync/glue/history_model_worker.h ('k') | chrome/browser/sync/glue/typed_url_data_type_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698