Chromium Code Reviews| Index: chrome/browser/chromeos/gdata/gdata_uploader.cc |
| diff --git a/chrome/browser/chromeos/gdata/gdata_uploader.cc b/chrome/browser/chromeos/gdata/gdata_uploader.cc |
| index f9dc6604b6655da8362e6fcd4d25d025e615318c..672c679f6b39377ce005e0e20cc188a330e36ba9 100644 |
| --- a/chrome/browser/chromeos/gdata/gdata_uploader.cc |
| +++ b/chrome/browser/chromeos/gdata/gdata_uploader.cc |
| @@ -52,6 +52,8 @@ int GDataUploader::UploadFile(scoped_ptr<UploadFileInfo> upload_file_info) { |
| DCHECK(!upload_file_info->title.empty()); |
| DCHECK(!upload_file_info->content_type.empty()); |
| + base::AutoLock lock(lock_); |
| + |
| const int upload_id = next_upload_id_++; |
| upload_file_info->upload_id = upload_id; |
| // Add upload_file_info to our internal map and take ownership. |
| @@ -73,6 +75,8 @@ int GDataUploader::UploadFile(scoped_ptr<UploadFileInfo> upload_file_info) { |
| void GDataUploader::UpdateUpload(int upload_id, |
| content::DownloadItem* download) { |
|
satorux1
2012/06/14 21:32:34
on what thread is this function called? In other p
hshi1
2012/06/14 21:40:17
Done.
satorux1
2012/06/14 21:47:25
Hmm, then seems to me that all functions run on UI
|
| + base::AutoLock lock(lock_); |
| + |
| UploadFileInfo* upload_file_info = GetUploadFileInfo(upload_id); |
| if (!upload_file_info) |
| return; |
| @@ -134,6 +138,7 @@ int64 GDataUploader::GetUploadedBytes(int upload_id) const { |
| UploadFileInfo* GDataUploader::GetUploadFileInfo(int upload_id) const { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + lock_.AssertAcquired(); |
| UploadFileInfoMap::const_iterator it = pending_uploads_.find(upload_id); |
| DVLOG_IF(1, it == pending_uploads_.end()) << "No upload found for id " |
| @@ -156,6 +161,7 @@ void GDataUploader::OpenFile(UploadFileInfo* upload_file_info) { |
| void GDataUploader::OpenCompletionCallback(int upload_id, int result) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + base::AutoLock lock(lock_); |
| UploadFileInfo* upload_file_info = GetUploadFileInfo(upload_id); |
| if (!upload_file_info) |
| @@ -208,6 +214,7 @@ void GDataUploader::OnUploadLocationReceived( |
| GDataErrorCode code, |
| const GURL& upload_location) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + base::AutoLock lock(lock_); |
| UploadFileInfo* upload_file_info = GetUploadFileInfo(upload_id); |
| if (!upload_file_info) |
| @@ -230,6 +237,8 @@ void GDataUploader::OnUploadLocationReceived( |
| void GDataUploader::UploadNextChunk(UploadFileInfo* upload_file_info) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + lock_.AssertAcquired(); |
| + |
| // Check that |upload_file_info| is in pending_uploads_. |
| DCHECK(upload_file_info == GetUploadFileInfo(upload_file_info->upload_id)); |
| DVLOG(1) << "Number of pending uploads=" << pending_uploads_.size(); |
| @@ -270,6 +279,8 @@ void GDataUploader::ReadCompletionCallback( |
| // The Read is asynchronously executed on BrowserThread::UI, where |
| // Read() was called. |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + base::AutoLock lock(lock_); |
| + |
| DVLOG(1) << "ReadCompletionCallback bytes read=" << bytes_read; |
| UploadFileInfo* upload_file_info = GetUploadFileInfo(upload_id); |
| @@ -304,6 +315,7 @@ void GDataUploader::OnResumeUploadResponseReceived( |
| const ResumeUploadResponse& response, |
| scoped_ptr<DocumentEntry> entry) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + base::AutoLock lock(lock_); |
| UploadFileInfo* upload_file_info = GetUploadFileInfo(upload_id); |
| if (!upload_file_info) |
| @@ -319,8 +331,10 @@ void GDataUploader::OnResumeUploadResponseReceived( |
| upload_file_info->completion_callback.Run(base::PLATFORM_FILE_OK, |
| upload_file_info); |
| } |
| - // TODO(achuith): DeleteUpload() here and let clients call |
| - // GDataFileSystem::AddUploadedFile. |
| + |
| + // Remove |upload_file_info| from the UploadFileInfoMap. The UploadFileInfo |
| + // object will be deleted later upon transfer completion. |
| + RemoveUpload(upload_file_info); |
| return; |
| } |
| @@ -354,6 +368,8 @@ void GDataUploader::OnResumeUploadResponseReceived( |
| void GDataUploader::MoveFileToCache(UploadFileInfo* upload_file_info) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + lock_.AssertAcquired(); |
| + |
| if (upload_file_info->entry == NULL) |
| return; |
| @@ -362,30 +378,42 @@ void GDataUploader::MoveFileToCache(UploadFileInfo* upload_file_info) { |
| upload_file_info->gdata_path.DirName(), |
| upload_file_info->entry.get(), |
| upload_file_info->file_path, |
| - GDataCache::FILE_OPERATION_MOVE); |
| - DeleteUpload(upload_file_info); |
| + GDataCache::FILE_OPERATION_MOVE, |
| + base::Bind(&GDataUploader::OnAddUploadFileComplete, |
| + uploader_factory_.GetWeakPtr(), |
| + upload_file_info)); |
| + |
| + // Remove |upload_file_info| from the UploadFileInfoMap. The UploadFileInfo |
| + // object will be deleted in OnAddUploadFileComplete. |
| + RemoveUpload(upload_file_info); |
| +} |
| + |
| +void GDataUploader::OnAddUploadFileComplete(UploadFileInfo* upload_file_info) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + delete upload_file_info; |
| } |
| void GDataUploader::UploadFailed(UploadFileInfo* upload_file_info, |
| base::PlatformFileError error) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + lock_.AssertAcquired(); |
| + |
| LOG(ERROR) << "Upload failed " << upload_file_info->DebugString(); |
| if (!upload_file_info->completion_callback.is_null()) { |
| upload_file_info->completion_callback.Run(error, |
| upload_file_info); |
| } |
| - DeleteUpload(upload_file_info); |
| + |
| + RemoveUpload(upload_file_info); |
| + delete upload_file_info; |
| } |
| -void GDataUploader::DeleteUpload(UploadFileInfo* upload_file_info) { |
| +void GDataUploader::RemoveUpload(UploadFileInfo* upload_file_info) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + lock_.AssertAcquired(); |
| - DVLOG(1) << "Deleting upload " << upload_file_info->gdata_path.value(); |
| + DVLOG(1) << "Removing upload " << upload_file_info->gdata_path.value(); |
| pending_uploads_.erase(upload_file_info->upload_id); |
| - |
| - // The file stream is closed by the destructor asynchronously. |
| - delete upload_file_info->file_stream; |
| - delete upload_file_info; |
| } |
| } // namespace gdata |