| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "chrome/browser/chromeos/drive/drive_scheduler.h" | 5 #include "chrome/browser/chromeos/drive/drive_scheduler.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 | 8 |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 StartNewJob(new_job.Pass(), TYPE_UPLOAD_EXISTING_FILE); | 359 StartNewJob(new_job.Pass(), TYPE_UPLOAD_EXISTING_FILE); |
| 360 } | 360 } |
| 361 | 361 |
| 362 void DriveScheduler::StartNewJob(scoped_ptr<QueueEntry> job, JobType type) { | 362 void DriveScheduler::StartNewJob(scoped_ptr<QueueEntry> job, JobType type) { |
| 363 // job_info is owned by job_map_ and released when it is removed in OnJobDone. | 363 // job_info is owned by job_map_ and released when it is removed in OnJobDone. |
| 364 JobInfo* job_info = new JobInfo(type); | 364 JobInfo* job_info = new JobInfo(type); |
| 365 job->job_id = job_info->job_id = job_map_.Add(job_info); | 365 job->job_id = job_info->job_id = job_map_.Add(job_info); |
| 366 job_info->file_path = job->drive_file_path; | 366 job_info->file_path = job->drive_file_path; |
| 367 | 367 |
| 368 QueueJob(job.Pass()); | 368 QueueJob(job.Pass()); |
| 369 NotifyJobAdded(*job_info); |
| 369 StartJobLoop(GetJobQueueType(type)); | 370 StartJobLoop(GetJobQueueType(type)); |
| 370 } | 371 } |
| 371 | 372 |
| 372 void DriveScheduler::QueueJob(scoped_ptr<QueueEntry> job) { | 373 void DriveScheduler::QueueJob(scoped_ptr<QueueEntry> job) { |
| 373 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 374 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 374 | 375 |
| 375 JobInfo* job_info = job_map_.Lookup(job->job_id); | 376 JobInfo* job_info = job_map_.Lookup(job->job_id); |
| 376 DCHECK(job_info); | 377 DCHECK(job_info); |
| 377 | 378 |
| 378 QueueType queue_type = GetJobQueueType(job_info->job_type); | 379 QueueType queue_type = GetJobQueueType(job_info->job_type); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 404 // Increment the number of jobs. | 405 // Increment the number of jobs. |
| 405 ++jobs_running_[queue_type]; | 406 ++jobs_running_[queue_type]; |
| 406 | 407 |
| 407 // Should copy before calling queue_.pop_front(). | 408 // Should copy before calling queue_.pop_front(). |
| 408 scoped_ptr<QueueEntry> queue_entry(queue_[queue_type].front()); | 409 scoped_ptr<QueueEntry> queue_entry(queue_[queue_type].front()); |
| 409 queue_[queue_type].pop_front(); | 410 queue_[queue_type].pop_front(); |
| 410 | 411 |
| 411 JobInfo* job_info = job_map_.Lookup(queue_entry->job_id); | 412 JobInfo* job_info = job_map_.Lookup(queue_entry->job_id); |
| 412 DCHECK(job_info); | 413 DCHECK(job_info); |
| 413 job_info->state = STATE_RUNNING; | 414 job_info->state = STATE_RUNNING; |
| 415 NotifyJobUpdated(*job_info); |
| 414 | 416 |
| 415 // The some arguments are evaluated after bind, so we copy the pointer to the | 417 // The some arguments are evaluated after bind, so we copy the pointer to the |
| 416 // QueueEntry | 418 // QueueEntry |
| 417 QueueEntry* entry = queue_entry.get(); | 419 QueueEntry* entry = queue_entry.get(); |
| 418 | 420 |
| 419 switch (job_info->job_type) { | 421 switch (job_info->job_type) { |
| 420 case TYPE_GET_ABOUT_RESOURCE: { | 422 case TYPE_GET_ABOUT_RESOURCE: { |
| 421 drive_service_->GetAboutResource( | 423 drive_service_->GetAboutResource( |
| 422 base::Bind(&DriveScheduler::OnGetAboutResourceJobDone, | 424 base::Bind(&DriveScheduler::OnGetAboutResourceJobDone, |
| 423 weak_ptr_factory_.GetWeakPtr(), | 425 weak_ptr_factory_.GetWeakPtr(), |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 687 JobInfo* job_info = job_map_.Lookup(queue_entry->job_id); | 689 JobInfo* job_info = job_map_.Lookup(queue_entry->job_id); |
| 688 DCHECK(job_info); | 690 DCHECK(job_info); |
| 689 QueueType queue_type = GetJobQueueType(job_info->job_type); | 691 QueueType queue_type = GetJobQueueType(job_info->job_type); |
| 690 | 692 |
| 691 // Decrement the number of jobs for this queue. | 693 // Decrement the number of jobs for this queue. |
| 692 --jobs_running_[queue_type]; | 694 --jobs_running_[queue_type]; |
| 693 | 695 |
| 694 // Retry, depending on the error. | 696 // Retry, depending on the error. |
| 695 if (error == DRIVE_FILE_ERROR_THROTTLED) { | 697 if (error == DRIVE_FILE_ERROR_THROTTLED) { |
| 696 job_info->state = STATE_RETRY; | 698 job_info->state = STATE_RETRY; |
| 699 NotifyJobUpdated(*job_info); |
| 697 | 700 |
| 698 // Requeue the job. | 701 // Requeue the job. |
| 699 QueueJob(queue_entry.Pass()); | 702 QueueJob(queue_entry.Pass()); |
| 700 | 703 |
| 701 ThrottleAndContinueJobLoop(queue_type); | 704 ThrottleAndContinueJobLoop(queue_type); |
| 702 | 705 |
| 703 return scoped_ptr<DriveScheduler::QueueEntry>(); | 706 return scoped_ptr<DriveScheduler::QueueEntry>(); |
| 704 } else { | 707 } else { |
| 708 NotifyJobDone(*job_info, error); |
| 705 // The job has finished, no retry will happen in the scheduler. Now we can | 709 // The job has finished, no retry will happen in the scheduler. Now we can |
| 706 // remove the job info from the map. This is the only place of the removal. | 710 // remove the job info from the map. This is the only place of the removal. |
| 707 job_map_.Remove(queue_entry->job_id); | 711 job_map_.Remove(queue_entry->job_id); |
| 708 | 712 |
| 709 ResetThrottleAndContinueJobLoop(queue_type); | 713 ResetThrottleAndContinueJobLoop(queue_type); |
| 710 | 714 |
| 711 // Send the entry back. | 715 // Send the entry back. |
| 712 return queue_entry.Pass(); | 716 return queue_entry.Pass(); |
| 713 } | 717 } |
| 714 } | 718 } |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 856 queue_entry->upload_completion_callback.Run( | 860 queue_entry->upload_completion_callback.Run( |
| 857 error, drive_path, file_path, resource_entry.Pass()); | 861 error, drive_path, file_path, resource_entry.Pass()); |
| 858 } | 862 } |
| 859 | 863 |
| 860 void DriveScheduler::UpdateProgress(JobID job_id, int64 progress, int64 total) { | 864 void DriveScheduler::UpdateProgress(JobID job_id, int64 progress, int64 total) { |
| 861 JobInfo* job_info = job_map_.Lookup(job_id); | 865 JobInfo* job_info = job_map_.Lookup(job_id); |
| 862 DCHECK(job_info); | 866 DCHECK(job_info); |
| 863 | 867 |
| 864 job_info->num_completed_bytes = progress; | 868 job_info->num_completed_bytes = progress; |
| 865 job_info->num_total_bytes = total; | 869 job_info->num_total_bytes = total; |
| 870 NotifyJobUpdated(*job_info); |
| 866 } | 871 } |
| 867 | 872 |
| 868 void DriveScheduler::OnConnectionTypeChanged( | 873 void DriveScheduler::OnConnectionTypeChanged( |
| 869 net::NetworkChangeNotifier::ConnectionType type) { | 874 net::NetworkChangeNotifier::ConnectionType type) { |
| 870 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 875 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 871 | 876 |
| 872 // Resume the job loop if the network is back online. Note that we don't | 877 // Resume the job loop if the network is back online. Note that we don't |
| 873 // need to check the type of the network as it will be checked in | 878 // need to check the type of the network as it will be checked in |
| 874 // ShouldStopJobLoop() as soon as the loop is resumed. | 879 // ShouldStopJobLoop() as soon as the loop is resumed. |
| 875 if (!net::NetworkChangeNotifier::IsOffline()) { | 880 if (!net::NetworkChangeNotifier::IsOffline()) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 FOR_EACH_OBSERVER(JobListObserver, observer_list_, | 923 FOR_EACH_OBSERVER(JobListObserver, observer_list_, |
| 919 OnJobDone(job_info, error)); | 924 OnJobDone(job_info, error)); |
| 920 } | 925 } |
| 921 | 926 |
| 922 void DriveScheduler::NotifyJobUpdated(const JobInfo& job_info) { | 927 void DriveScheduler::NotifyJobUpdated(const JobInfo& job_info) { |
| 923 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 928 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 924 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobUpdated(job_info)); | 929 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobUpdated(job_info)); |
| 925 } | 930 } |
| 926 | 931 |
| 927 } // namespace drive | 932 } // namespace drive |
| OLD | NEW |