| 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
|
|
|