| Index: chrome/browser/chromeos/drive/job_scheduler.cc
|
| diff --git a/chrome/browser/chromeos/drive/job_scheduler.cc b/chrome/browser/chromeos/drive/job_scheduler.cc
|
| index 815f821abc2aa75e64f3ce30673bf0e4f5491748..17fbc2a95a80aed2e684ef733615b7d0bcf03ca2 100644
|
| --- a/chrome/browser/chromeos/drive/job_scheduler.cc
|
| +++ b/chrome/browser/chromeos/drive/job_scheduler.cc
|
| @@ -33,22 +33,20 @@ const int JobScheduler::kMaxJobCount[] = {
|
| 1, // FILE_QUEUE
|
| };
|
|
|
| -JobScheduler::QueueEntry::QueueEntry()
|
| - : job_id(-1),
|
| +JobScheduler::JobEntry::JobEntry(JobType type)
|
| + : job_info(type),
|
| context(DriveClientContext(USER_INITIATED)) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| }
|
|
|
| -JobScheduler::QueueEntry::~QueueEntry() {
|
| +JobScheduler::JobEntry::~JobEntry() {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| }
|
|
|
| -bool JobScheduler::QueueEntry::Compare(
|
| - const JobScheduler::QueueEntry* left,
|
| - const JobScheduler::QueueEntry* right) {
|
| +bool JobScheduler::JobEntry::Less(const JobEntry& left, const JobEntry& right) {
|
| // Lower values of ContextType are higher priority.
|
| // See also the comment at ContextType.
|
| - return (left->context.type < right->context.type);
|
| + return (left.context.type < right.context.type);
|
| }
|
|
|
| JobScheduler::JobScheduler(
|
| @@ -79,16 +77,13 @@ JobScheduler::~JobScheduler() {
|
| }
|
| DCHECK_EQ(num_pending_jobs + num_running_jobs, job_map_.size());
|
|
|
| - for (int i = 0; i < NUM_QUEUES; ++i) {
|
| - STLDeleteElements(&queue_[i]);
|
| - }
|
| net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
|
| }
|
|
|
| std::vector<JobInfo> JobScheduler::GetJobInfoList() {
|
| std::vector<JobInfo> job_info_list;
|
| for (JobIDMap::iterator iter(&job_map_); !iter.IsAtEnd(); iter.Advance())
|
| - job_info_list.push_back(*iter.GetCurrentValue());
|
| + job_info_list.push_back(iter.GetCurrentValue()->job_info);
|
| return job_info_list;
|
| }
|
|
|
| @@ -108,9 +103,9 @@ void JobScheduler::CancelJob(JobID job_id) {
|
| // TODO(kinaba): Move the cancellation feature from DriveService
|
| // to JobScheduler. In particular, implement cancel based on job_id.
|
| // crbug.com/231029
|
| - JobInfo* info = job_map_.Lookup(job_id);
|
| - if (info)
|
| - drive_service_->CancelForFilePath(info->file_path);
|
| + JobEntry* job = job_map_.Lookup(job_id);
|
| + if (job)
|
| + drive_service_->CancelForFilePath(job->job_info.file_path);
|
| }
|
|
|
| void JobScheduler::CancelAllJobs() {
|
| @@ -126,10 +121,10 @@ void JobScheduler::GetAccountMetadata(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_GET_ACCOUNT_METADATA));
|
| new_job->get_account_metadata_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_GET_ACCOUNT_METADATA);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::GetAboutResource(
|
| @@ -137,10 +132,10 @@ void JobScheduler::GetAboutResource(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_GET_ABOUT_RESOURCE));
|
| new_job->get_about_resource_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_GET_ABOUT_RESOURCE);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::GetAppList(
|
| @@ -148,10 +143,10 @@ void JobScheduler::GetAppList(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_GET_APP_LIST));
|
| new_job->get_app_list_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_GET_APP_LIST);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::GetAllResourceList(
|
| @@ -159,10 +154,10 @@ void JobScheduler::GetAllResourceList(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_GET_ALL_RESOURCE_LIST));
|
| new_job->get_resource_list_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_GET_ALL_RESOURCE_LIST);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::GetResourceListInDirectory(
|
| @@ -171,11 +166,12 @@ void JobScheduler::GetResourceListInDirectory(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(
|
| + TYPE_GET_RESOURCE_LIST_IN_DIRECTORY));
|
| new_job->directory_resource_id = directory_resource_id;
|
| new_job->get_resource_list_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_GET_RESOURCE_LIST_IN_DIRECTORY);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::Search(
|
| @@ -184,11 +180,11 @@ void JobScheduler::Search(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_SEARCH));
|
| new_job->search_query = search_query;
|
| new_job->get_resource_list_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_SEARCH);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::GetChangeList(
|
| @@ -197,11 +193,11 @@ void JobScheduler::GetChangeList(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_GET_CHANGE_LIST));
|
| new_job->start_changestamp = start_changestamp;
|
| new_job->get_resource_list_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_GET_CHANGE_LIST);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::ContinueGetResourceList(
|
| @@ -210,11 +206,11 @@ void JobScheduler::ContinueGetResourceList(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_CONTINUE_GET_RESOURCE_LIST));
|
| new_job->feed_url = feed_url;
|
| new_job->get_resource_list_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_CONTINUE_GET_RESOURCE_LIST);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::GetResourceEntry(
|
| @@ -224,12 +220,12 @@ void JobScheduler::GetResourceEntry(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_GET_RESOURCE_ENTRY));
|
| new_job->resource_id = resource_id;
|
| new_job->context = context;
|
| new_job->get_resource_entry_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_GET_RESOURCE_ENTRY);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::DeleteResource(
|
| @@ -238,11 +234,11 @@ void JobScheduler::DeleteResource(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_DELETE_RESOURCE));
|
| new_job->resource_id = resource_id;
|
| new_job->entry_action_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_DELETE_RESOURCE);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
|
|
| @@ -253,12 +249,12 @@ void JobScheduler::CopyHostedDocument(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_COPY_HOSTED_DOCUMENT));
|
| new_job->resource_id = resource_id;
|
| new_job->new_name = new_name;
|
| new_job->get_resource_entry_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_COPY_HOSTED_DOCUMENT);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::RenameResource(
|
| @@ -268,12 +264,12 @@ void JobScheduler::RenameResource(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_RENAME_RESOURCE));
|
| new_job->resource_id = resource_id;
|
| new_job->new_name = new_name;
|
| new_job->entry_action_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_RENAME_RESOURCE);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::AddResourceToDirectory(
|
| @@ -283,12 +279,12 @@ void JobScheduler::AddResourceToDirectory(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_ADD_RESOURCE_TO_DIRECTORY));
|
| new_job->parent_resource_id = parent_resource_id;
|
| new_job->resource_id = resource_id;
|
| new_job->entry_action_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_ADD_RESOURCE_TO_DIRECTORY);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::RemoveResourceFromDirectory(
|
| @@ -297,12 +293,13 @@ void JobScheduler::RemoveResourceFromDirectory(
|
| const google_apis::EntryActionCallback& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(
|
| + TYPE_REMOVE_RESOURCE_FROM_DIRECTORY));
|
| new_job->parent_resource_id = parent_resource_id;
|
| new_job->resource_id = resource_id;
|
| new_job->entry_action_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_REMOVE_RESOURCE_FROM_DIRECTORY);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::AddNewDirectory(
|
| @@ -311,12 +308,12 @@ void JobScheduler::AddNewDirectory(
|
| const google_apis::GetResourceEntryCallback& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_ADD_NEW_DIRECTORY));
|
| new_job->parent_resource_id = parent_resource_id;
|
| new_job->directory_name = directory_name;
|
| new_job->get_resource_entry_callback = callback;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_ADD_NEW_DIRECTORY);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| JobID JobScheduler::DownloadFile(
|
| @@ -328,7 +325,7 @@ JobID JobScheduler::DownloadFile(
|
| const google_apis::GetContentCallback& get_content_callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_DOWNLOAD_FILE));
|
| new_job->drive_file_path = virtual_path;
|
| new_job->local_file_path = local_cache_path;
|
| new_job->download_url = download_url;
|
| @@ -336,7 +333,7 @@ JobID JobScheduler::DownloadFile(
|
| new_job->download_action_callback = download_action_callback;
|
| new_job->get_content_callback = get_content_callback;
|
|
|
| - return StartNewJob(new_job.Pass(), TYPE_DOWNLOAD_FILE);
|
| + return StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::UploadNewFile(
|
| @@ -349,7 +346,7 @@ void JobScheduler::UploadNewFile(
|
| const google_apis::UploadCompletionCallback& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_UPLOAD_NEW_FILE));
|
| new_job->resource_id = parent_resource_id;
|
| new_job->drive_file_path = drive_file_path;
|
| new_job->local_file_path = local_file_path;
|
| @@ -358,7 +355,7 @@ void JobScheduler::UploadNewFile(
|
| new_job->upload_completion_callback = callback;
|
| new_job->context = context;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_UPLOAD_NEW_FILE);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::UploadExistingFile(
|
| @@ -371,7 +368,7 @@ void JobScheduler::UploadExistingFile(
|
| const google_apis::UploadCompletionCallback& upload_completion_callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_UPLOAD_EXISTING_FILE));
|
| new_job->resource_id = resource_id;
|
| new_job->drive_file_path = drive_file_path;
|
| new_job->local_file_path = local_file_path;
|
| @@ -380,7 +377,7 @@ void JobScheduler::UploadExistingFile(
|
| new_job->upload_completion_callback = upload_completion_callback;
|
| new_job->context = context;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_UPLOAD_EXISTING_FILE);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| void JobScheduler::CreateFile(
|
| @@ -392,7 +389,7 @@ void JobScheduler::CreateFile(
|
| const google_apis::UploadCompletionCallback& callback) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - scoped_ptr<QueueEntry> new_job(new QueueEntry);
|
| + scoped_ptr<JobEntry> new_job(new JobEntry(TYPE_CREATE_FILE));
|
| new_job->resource_id = parent_resource_id;
|
| new_job->drive_file_path = drive_file_path;
|
| new_job->title = title;
|
| @@ -400,34 +397,42 @@ void JobScheduler::CreateFile(
|
| new_job->upload_completion_callback = callback;
|
| new_job->context = context;
|
|
|
| - StartNewJob(new_job.Pass(), TYPE_CREATE_FILE);
|
| + StartNewJob(new_job.Pass());
|
| }
|
|
|
| -JobID JobScheduler::StartNewJob(scoped_ptr<QueueEntry> job, JobType type) {
|
| - // job_info is owned by job_map_ and released when it is removed in OnJobDone.
|
| - JobInfo* job_info = new JobInfo(type);
|
| - job->job_id = job_info->job_id = job_map_.Add(job_info);
|
| +JobID JobScheduler::StartNewJob(scoped_ptr<JobEntry> job) {
|
| + DCHECK(job);
|
| +
|
| + // |job| is owned by job_map_ and released when it is removed in OnJobDone.
|
| + JobInfo* job_info = &job->job_info;
|
| job_info->file_path = job->drive_file_path;
|
| + job_info->job_id = job_map_.Add(job.release());
|
|
|
| - QueueJob(job.Pass());
|
| + QueueJob(job_info->job_id);
|
| NotifyJobAdded(*job_info);
|
| - StartJobLoop(GetJobQueueType(type));
|
| + StartJobLoop(GetJobQueueType(job_info->job_type));
|
| return job_info->job_id;
|
| }
|
|
|
| -void JobScheduler::QueueJob(scoped_ptr<QueueEntry> job) {
|
| +void JobScheduler::QueueJob(JobID job_id) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - JobInfo* job_info = job_map_.Lookup(job->job_id);
|
| - DCHECK(job_info);
|
| + JobEntry* job_entry = job_map_.Lookup(job_id);
|
| + DCHECK(job_entry);
|
| + const JobInfo& job_info = job_entry->job_info;
|
|
|
| - QueueType queue_type = GetJobQueueType(job_info->job_type);
|
| - std::list<QueueEntry*>& queue = queue_[queue_type];
|
| + QueueType queue_type = GetJobQueueType(job_info.job_type);
|
| + std::list<JobID>* queue = &queue_[queue_type];
|
|
|
| - queue.push_back(job.release());
|
| - queue.sort(&QueueEntry::Compare);
|
| + std::list<JobID>::iterator it = queue->begin();
|
| + for (; it != queue->end(); ++it) {
|
| + JobEntry* job_entry2 = job_map_.Lookup(*it);
|
| + if (JobEntry::Less(*job_entry, *job_entry2))
|
| + break;
|
| + }
|
| + queue->insert(it, job_id);
|
|
|
| - util::Log("Job queued: %s - %s", job_info->ToString().c_str(),
|
| + util::Log("Job queued: %s - %s", job_info.ToString().c_str(),
|
| GetQueueInfo(queue_type).c_str());
|
| }
|
|
|
| @@ -445,34 +450,32 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| return;
|
| }
|
|
|
| + JobID job_id = queue_[queue_type].front();
|
| + JobEntry* entry = job_map_.Lookup(job_id);
|
| + DCHECK(entry);
|
| +
|
| // Check if we should defer based on the first item in the queue
|
| - if (ShouldStopJobLoop(queue_type, queue_[queue_type].front()->context)) {
|
| + if (ShouldStopJobLoop(queue_type, entry->context)) {
|
| return;
|
| }
|
|
|
| // Increment the number of jobs.
|
| ++jobs_running_[queue_type];
|
|
|
| - // Should copy before calling queue_.pop_front().
|
| - scoped_ptr<QueueEntry> queue_entry(queue_[queue_type].front());
|
| queue_[queue_type].pop_front();
|
|
|
| - JobInfo* job_info = job_map_.Lookup(queue_entry->job_id);
|
| - DCHECK(job_info);
|
| + JobInfo* job_info = &entry->job_info;
|
| job_info->state = STATE_RUNNING;
|
| job_info->start_time = base::Time::Now();
|
| NotifyJobUpdated(*job_info);
|
|
|
| - // The some arguments are evaluated after bind, so we copy the pointer to the
|
| - // QueueEntry
|
| - QueueEntry* entry = queue_entry.get();
|
| -
|
| switch (job_info->job_type) {
|
| case TYPE_GET_ABOUT_RESOURCE: {
|
| drive_service_->GetAboutResource(
|
| base::Bind(&JobScheduler::OnGetAboutResourceJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_about_resource_callback));
|
| }
|
| break;
|
|
|
| @@ -480,7 +483,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| drive_service_->GetAccountMetadata(
|
| base::Bind(&JobScheduler::OnGetAccountMetadataJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_account_metadata_callback));
|
| }
|
| break;
|
|
|
| @@ -488,7 +492,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| drive_service_->GetAppList(
|
| base::Bind(&JobScheduler::OnGetAppListJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_app_list_callback));
|
| }
|
| break;
|
|
|
| @@ -496,7 +501,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| drive_service_->GetAllResourceList(
|
| base::Bind(&JobScheduler::OnGetResourceListJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_resource_list_callback));
|
| }
|
| break;
|
|
|
| @@ -505,7 +511,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->directory_resource_id,
|
| base::Bind(&JobScheduler::OnGetResourceListJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_resource_list_callback));
|
| }
|
| break;
|
|
|
| @@ -514,7 +521,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->search_query,
|
| base::Bind(&JobScheduler::OnGetResourceListJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_resource_list_callback));
|
| }
|
| break;
|
|
|
| @@ -523,7 +531,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->start_changestamp,
|
| base::Bind(&JobScheduler::OnGetResourceListJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_resource_list_callback));
|
| }
|
| break;
|
|
|
| @@ -532,7 +541,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->feed_url,
|
| base::Bind(&JobScheduler::OnGetResourceListJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_resource_list_callback));
|
| }
|
| break;
|
|
|
| @@ -541,7 +551,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->resource_id,
|
| base::Bind(&JobScheduler::OnGetResourceEntryJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_resource_entry_callback));
|
| }
|
| break;
|
|
|
| @@ -551,7 +562,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| "", // etag
|
| base::Bind(&JobScheduler::OnEntryActionJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->entry_action_callback));
|
| }
|
| break;
|
|
|
| @@ -561,7 +573,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->new_name,
|
| base::Bind(&JobScheduler::OnGetResourceEntryJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_resource_entry_callback));
|
| }
|
| break;
|
|
|
| @@ -571,7 +584,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->new_name,
|
| base::Bind(&JobScheduler::OnEntryActionJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->entry_action_callback));
|
| }
|
| break;
|
|
|
| @@ -581,7 +595,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->resource_id,
|
| base::Bind(&JobScheduler::OnEntryActionJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->entry_action_callback));
|
| }
|
| break;
|
|
|
| @@ -591,7 +606,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->resource_id,
|
| base::Bind(&JobScheduler::OnEntryActionJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->entry_action_callback));
|
| }
|
| break;
|
|
|
| @@ -601,7 +617,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->directory_name,
|
| base::Bind(&JobScheduler::OnGetResourceEntryJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)));
|
| + job_id,
|
| + entry->get_resource_entry_callback));
|
| }
|
| break;
|
|
|
| @@ -612,11 +629,12 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->download_url,
|
| base::Bind(&JobScheduler::OnDownloadActionJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)),
|
| + job_id,
|
| + entry->download_action_callback),
|
| entry->get_content_callback,
|
| base::Bind(&JobScheduler::UpdateProgress,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - job_info->job_id));
|
| + job_id));
|
| }
|
| break;
|
|
|
| @@ -629,10 +647,11 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->content_type,
|
| base::Bind(&JobScheduler::OnUploadCompletionJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)),
|
| + job_id,
|
| + entry->upload_completion_callback),
|
| base::Bind(&JobScheduler::UpdateProgress,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - job_info->job_id));
|
| + job_id));
|
| }
|
| break;
|
|
|
| @@ -645,10 +664,11 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->etag,
|
| base::Bind(&JobScheduler::OnUploadCompletionJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)),
|
| + job_id,
|
| + entry->upload_completion_callback),
|
| base::Bind(&JobScheduler::UpdateProgress,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - job_info->job_id));
|
| + job_id));
|
| }
|
| break;
|
|
|
| @@ -663,7 +683,8 @@ void JobScheduler::DoJobLoop(QueueType queue_type) {
|
| entry->content_type,
|
| base::Bind(&JobScheduler::OnUploadCompletionJobDone,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(&queue_entry)),
|
| + job_id,
|
| + entry->upload_completion_callback),
|
| google_apis::ProgressCallback());
|
| }
|
| break;
|
| @@ -748,12 +769,12 @@ void JobScheduler::ResetThrottleAndContinueJobLoop(QueueType queue_type) {
|
| queue_type));
|
| }
|
|
|
| -bool JobScheduler::OnJobDone(scoped_ptr<JobScheduler::QueueEntry> queue_entry,
|
| - FileError error) {
|
| +bool JobScheduler::OnJobDone(JobID job_id, FileError error) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - JobInfo* job_info = job_map_.Lookup(queue_entry->job_id);
|
| - DCHECK(job_info);
|
| + JobEntry* job_entry = job_map_.Lookup(job_id);
|
| + DCHECK(job_entry);
|
| + JobInfo* job_info = &job_entry->job_info;
|
| QueueType queue_type = GetJobQueueType(job_info->job_type);
|
|
|
| const base::TimeDelta elapsed = base::Time::Now() - job_info->start_time;
|
| @@ -772,7 +793,7 @@ bool JobScheduler::OnJobDone(scoped_ptr<JobScheduler::QueueEntry> queue_entry,
|
| NotifyJobUpdated(*job_info);
|
|
|
| // Requeue the job.
|
| - QueueJob(queue_entry.Pass());
|
| + QueueJob(job_id);
|
|
|
| ThrottleAndContinueJobLoop(queue_type);
|
| return false;
|
| @@ -780,7 +801,7 @@ bool JobScheduler::OnJobDone(scoped_ptr<JobScheduler::QueueEntry> queue_entry,
|
| NotifyJobDone(*job_info, error);
|
| // The job has finished, no retry will happen in the scheduler. Now we can
|
| // remove the job info from the map. This is the only place of the removal.
|
| - job_map_.Remove(queue_entry->job_id);
|
| + job_map_.Remove(job_id);
|
|
|
| ResetThrottleAndContinueJobLoop(queue_type);
|
| return true;
|
| @@ -788,116 +809,109 @@ bool JobScheduler::OnJobDone(scoped_ptr<JobScheduler::QueueEntry> queue_entry,
|
| }
|
|
|
| void JobScheduler::OnGetResourceListJobDone(
|
| - scoped_ptr<JobScheduler::QueueEntry> queue_entry,
|
| + JobID job_id,
|
| + const google_apis::GetResourceListCallback& callback,
|
| google_apis::GDataErrorCode error,
|
| scoped_ptr<google_apis::ResourceList> resource_list) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!queue_entry->get_resource_list_callback.is_null());
|
| + DCHECK(!callback.is_null());
|
|
|
| - google_apis::GetResourceListCallback callback =
|
| - queue_entry->get_resource_list_callback;
|
| - if (OnJobDone(queue_entry.Pass(), util::GDataToFileError(error)))
|
| + if (OnJobDone(job_id, util::GDataToFileError(error)))
|
| callback.Run(error, resource_list.Pass());
|
| }
|
|
|
| void JobScheduler::OnGetResourceEntryJobDone(
|
| - scoped_ptr<JobScheduler::QueueEntry> queue_entry,
|
| + JobID job_id,
|
| + const google_apis::GetResourceEntryCallback& callback,
|
| google_apis::GDataErrorCode error,
|
| scoped_ptr<google_apis::ResourceEntry> entry) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!queue_entry->get_resource_entry_callback.is_null());
|
| + DCHECK(!callback.is_null());
|
|
|
| - google_apis::GetResourceEntryCallback callback =
|
| - queue_entry->get_resource_entry_callback;
|
| - if (OnJobDone(queue_entry.Pass(), util::GDataToFileError(error)))
|
| + if (OnJobDone(job_id, util::GDataToFileError(error)))
|
| callback.Run(error, entry.Pass());
|
| }
|
|
|
| void JobScheduler::OnGetAboutResourceJobDone(
|
| - scoped_ptr<QueueEntry> queue_entry,
|
| + JobID job_id,
|
| + const google_apis::GetAboutResourceCallback& callback,
|
| google_apis::GDataErrorCode error,
|
| scoped_ptr<google_apis::AboutResource> about_resource) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!queue_entry->get_about_resource_callback.is_null());
|
| + DCHECK(!callback.is_null());
|
|
|
| - google_apis::GetAboutResourceCallback callback =
|
| - queue_entry->get_about_resource_callback;
|
| - if (OnJobDone(queue_entry.Pass(), util::GDataToFileError(error)))
|
| + if (OnJobDone(job_id, util::GDataToFileError(error)))
|
| callback.Run(error, about_resource.Pass());
|
| }
|
|
|
| void JobScheduler::OnGetAccountMetadataJobDone(
|
| - scoped_ptr<QueueEntry> queue_entry,
|
| + JobID job_id,
|
| + const google_apis::GetAccountMetadataCallback& callback,
|
| google_apis::GDataErrorCode error,
|
| scoped_ptr<google_apis::AccountMetadata> account_metadata) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!queue_entry->get_account_metadata_callback.is_null());
|
| + DCHECK(!callback.is_null());
|
|
|
| - google_apis::GetAccountMetadataCallback callback =
|
| - queue_entry->get_account_metadata_callback;
|
| - if (OnJobDone(queue_entry.Pass(), util::GDataToFileError(error)))
|
| + if (OnJobDone(job_id, util::GDataToFileError(error)))
|
| callback.Run(error, account_metadata.Pass());
|
| }
|
|
|
| void JobScheduler::OnGetAppListJobDone(
|
| - scoped_ptr<JobScheduler::QueueEntry> queue_entry,
|
| + JobID job_id,
|
| + const google_apis::GetAppListCallback& callback,
|
| google_apis::GDataErrorCode error,
|
| scoped_ptr<google_apis::AppList> app_list) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!queue_entry->get_app_list_callback.is_null());
|
| + DCHECK(!callback.is_null());
|
|
|
| - google_apis::GetAppListCallback callback = queue_entry->get_app_list_callback;
|
| - if (OnJobDone(queue_entry.Pass(), util::GDataToFileError(error)))
|
| + if (OnJobDone(job_id, util::GDataToFileError(error)))
|
| callback.Run(error, app_list.Pass());
|
| }
|
|
|
| void JobScheduler::OnEntryActionJobDone(
|
| - scoped_ptr<JobScheduler::QueueEntry> queue_entry,
|
| + JobID job_id,
|
| + const google_apis::EntryActionCallback& callback,
|
| google_apis::GDataErrorCode error) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!queue_entry->entry_action_callback.is_null());
|
| + DCHECK(!callback.is_null());
|
|
|
| - google_apis::EntryActionCallback callback =
|
| - queue_entry->entry_action_callback;
|
| - if (OnJobDone(queue_entry.Pass(), util::GDataToFileError(error)))
|
| + if (OnJobDone(job_id, util::GDataToFileError(error)))
|
| callback.Run(error);
|
| }
|
|
|
| void JobScheduler::OnDownloadActionJobDone(
|
| - scoped_ptr<JobScheduler::QueueEntry> queue_entry,
|
| + JobID job_id,
|
| + const google_apis::DownloadActionCallback& callback,
|
| google_apis::GDataErrorCode error,
|
| const base::FilePath& temp_file) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!queue_entry->download_action_callback.is_null());
|
| + DCHECK(!callback.is_null());
|
|
|
| - google_apis::DownloadActionCallback callback =
|
| - queue_entry->download_action_callback;
|
| - if (OnJobDone(queue_entry.Pass(), util::GDataToFileError(error)))
|
| + if (OnJobDone(job_id, util::GDataToFileError(error)))
|
| callback.Run(error, temp_file);
|
| }
|
|
|
| void JobScheduler::OnUploadCompletionJobDone(
|
| - scoped_ptr<QueueEntry> queue_entry,
|
| + JobID job_id,
|
| + const google_apis::UploadCompletionCallback& callback,
|
| google_apis::GDataErrorCode error,
|
| const base::FilePath& drive_path,
|
| const base::FilePath& file_path,
|
| scoped_ptr<google_apis::ResourceEntry> resource_entry) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!queue_entry->upload_completion_callback.is_null());
|
| + DCHECK(!callback.is_null());
|
|
|
| - google_apis::UploadCompletionCallback callback =
|
| - queue_entry->upload_completion_callback;
|
| - if (OnJobDone(queue_entry.Pass(), util::GDataToFileError(error)))
|
| + if (OnJobDone(job_id, util::GDataToFileError(error)))
|
| callback.Run(error, drive_path, file_path, resource_entry.Pass());
|
| }
|
|
|
| void JobScheduler::UpdateProgress(JobID job_id, int64 progress, int64 total) {
|
| - JobInfo* job_info = job_map_.Lookup(job_id);
|
| - DCHECK(job_info);
|
| + JobEntry* job_entry = job_map_.Lookup(job_id);
|
| + DCHECK(job_entry);
|
|
|
| - job_info->num_completed_bytes = progress;
|
| - job_info->num_total_bytes = total;
|
| - NotifyJobUpdated(*job_info);
|
| + job_entry->job_info.num_completed_bytes = progress;
|
| + job_entry->job_info.num_total_bytes = total;
|
| + NotifyJobUpdated(job_entry->job_info);
|
| }
|
|
|
| void JobScheduler::OnConnectionTypeChanged(
|
|
|