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

Unified Diff: chrome/browser/chromeos/gdata/gdata_uploader.cc

Issue 10540132: gdata: Convert GDataFileSystem::AddUploadFile() to asynchronous. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address Satoru's comments. Created 8 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/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
« no previous file with comments | « chrome/browser/chromeos/gdata/gdata_uploader.h ('k') | chrome/browser/chromeos/gdata/mock_gdata_file_system.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698