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

Unified Diff: chrome/browser/download/save_file_manager.cc

Issue 348037: Fourth patch in getting rid of caching MessageLoop pointers. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 1 month 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
« no previous file with comments | « chrome/browser/download/save_file_manager.h ('k') | chrome/browser/download/save_package.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/download/save_file_manager.cc
===================================================================
--- chrome/browser/download/save_file_manager.cc (revision 30688)
+++ chrome/browser/download/save_file_manager.cc (working copy)
@@ -12,7 +12,7 @@
#include "base/string_util.h"
#include "base/task.h"
#include "base/thread.h"
-#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_thread.h"
#include "chrome/browser/download/save_file.h"
#include "chrome/browser/download/save_package.h"
#include "chrome/browser/net/url_request_context_getter.h"
@@ -27,25 +27,9 @@
#include "net/url_request/url_request_context.h"
-SaveFileManager::SaveFileManager(MessageLoop* ui_loop,
- MessageLoop* io_loop,
- ResourceDispatcherHost* rdh)
+SaveFileManager::SaveFileManager(ResourceDispatcherHost* rdh)
: next_id_(0),
- ui_loop_(ui_loop),
- io_loop_(io_loop),
resource_dispatcher_host_(rdh) {
- DCHECK(ui_loop_);
- // Need to make sure that we are in UI thread because using g_browser_process
- // on a non-UI thread can cause crashes during shutdown.
- DCHECK_EQ(ui_loop_, MessageLoop::current());
- // Cache the message loop of file thread.
- base::Thread* thread = g_browser_process->file_thread();
- if (thread)
- file_loop_ = thread->message_loop();
- else
- // It could be NULL when it is created in unit test of
- // ResourceDispatcherHost.
- file_loop_ = NULL;
DCHECK(resource_dispatcher_host_);
}
@@ -57,16 +41,14 @@
// Called during the browser shutdown process to clean up any state (open files,
// timers) that live on the saving thread (file thread).
void SaveFileManager::Shutdown() {
- MessageLoop* loop = file_loop();
- if (loop) {
- loop->PostTask(FROM_HERE,
- NewRunnableMethod(this, &SaveFileManager::OnShutdown));
- }
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(this, &SaveFileManager::OnShutdown));
}
// Stop file thread operations.
void SaveFileManager::OnShutdown() {
- DCHECK_EQ(MessageLoop::current(), file_loop());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
STLDeleteValues(&save_file_map_);
}
@@ -82,14 +64,14 @@
// file a request from the file thread to the IO thread to generate a
// unique save ID.
int SaveFileManager::GetNextId() {
- DCHECK_EQ(MessageLoop::current(), io_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
return next_id_++;
}
void SaveFileManager::RegisterStartingRequest(const GURL& save_url,
SavePackage* save_package) {
// Make sure it runs in the UI thread.
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
int tab_id = save_package->tab_id();
// Register this starting request.
@@ -102,7 +84,7 @@
SavePackage* SaveFileManager::UnregisterStartingRequest(
const GURL& save_url, int tab_id) {
// Make sure it runs in UI thread.
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
TabToStartingRequestsMap::iterator it = tab_starting_requests_.find(tab_id);
if (it != tab_starting_requests_.end()) {
@@ -123,24 +105,9 @@
return NULL;
}
-void SaveFileManager::RequireSaveJobFromOtherSource(SaveFileCreateInfo* info) {
- // This function must be called on the UI thread, because the io_loop_
- // pointer may be junk when we use it on file thread. We can only rely on the
- // io_loop_ pointer being valid when we run code on the UI thread (or on
- // the IO thread.
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
- DCHECK_EQ(info->save_id, -1);
- // Since the data will come from render process, so we need to start
- // this kind of save job by ourself.
- io_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::OnRequireSaveJobFromOtherSource,
- info));
-}
-
// Look up a SavePackage according to a save id.
SavePackage* SaveFileManager::LookupPackage(int save_id) {
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
SavePackageMap::iterator it = packages_.find(save_id);
if (it != packages_.end())
return it->second;
@@ -156,18 +123,15 @@
const FilePath& file_full_path,
URLRequestContextGetter* request_context_getter,
SavePackage* save_package) {
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
- if (!io_loop_) {
- NOTREACHED(); // Net IO thread must exist.
- return;
- }
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
// Register a saving job.
RegisterStartingRequest(url, save_package);
if (save_source == SaveFileCreateInfo::SAVE_FILE_FROM_NET) {
DCHECK(url.is_valid());
- io_loop_->PostTask(FROM_HERE,
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
NewRunnableMethod(this,
&SaveFileManager::OnSaveURL,
url,
@@ -183,7 +147,13 @@
-1);
info->render_process_id = render_process_host_id;
info->render_view_id = render_view_id;
- RequireSaveJobFromOtherSource(info);
+
+ // Since the data will come from render process, so we need to start
+ // this kind of save job by ourself.
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ this, &SaveFileManager::OnRequireSaveJobFromOtherSource, info));
}
}
@@ -196,7 +166,7 @@
void SaveFileManager::RemoveSaveFile(int save_id, const GURL& save_url,
SavePackage* package) {
DCHECK(package);
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
// A save page job(SavePackage) can only have one manager,
// so remove it if it exists.
if (save_id == -1) {
@@ -226,25 +196,19 @@
// Utility function for deleting specified file.
void SaveFileManager::DeleteDirectoryOrFile(const FilePath& full_path,
bool is_dir) {
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
- MessageLoop* loop = file_loop();
- DCHECK(loop);
- loop->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::OnDeleteDirectoryOrFile,
- full_path,
- is_dir));
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(
+ this, &SaveFileManager::OnDeleteDirectoryOrFile, full_path, is_dir));
}
void SaveFileManager::SendCancelRequest(int save_id) {
// Cancel the request which has specific save id.
DCHECK_GT(save_id, -1);
- MessageLoop* loop = file_loop();
- DCHECK(loop);
- loop->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::CancelSave,
- save_id));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(this, &SaveFileManager::CancelSave, save_id));
}
// Notifications sent from the IO thread and run on the file thread:
@@ -253,17 +217,16 @@
// to create a SaveFile which will hold and finally destroy |info|. It will
// then passes |info| to the UI thread for reporting saving status.
void SaveFileManager::StartSave(SaveFileCreateInfo* info) {
- DCHECK_EQ(MessageLoop::current(), file_loop());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
DCHECK(info);
SaveFile* save_file = new SaveFile(info);
DCHECK(!LookupSaveFile(info->save_id));
save_file_map_[info->save_id] = save_file;
info->path = save_file->full_path();
- ui_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::OnStartSave,
- info));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(this, &SaveFileManager::OnStartSave, info));
}
// We do forward an update to the UI thread here, since we do not use timer to
@@ -273,16 +236,15 @@
void SaveFileManager::UpdateSaveProgress(int save_id,
net::IOBuffer* data,
int data_len) {
- DCHECK_EQ(MessageLoop::current(), file_loop());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
SaveFile* save_file = LookupSaveFile(save_id);
if (save_file) {
bool write_success = save_file->AppendDataToFile(data->data(), data_len);
- ui_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::OnUpdateSaveProgress,
- save_file->save_id(),
- save_file->bytes_so_far(),
- write_success));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ this, &SaveFileManager::OnUpdateSaveProgress, save_file->save_id(),
+ save_file->bytes_so_far(), write_success));
}
data->Release();
}
@@ -297,33 +259,32 @@
GURL save_url,
int render_process_id,
bool is_success) {
- DCHECK_EQ(MessageLoop::current(), file_loop());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
SaveFileMap::iterator it = save_file_map_.find(save_id);
if (it != save_file_map_.end()) {
SaveFile* save_file = it->second;
- ui_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::OnSaveFinished,
- save_id,
- save_file->bytes_so_far(),
- is_success));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ this, &SaveFileManager::OnSaveFinished, save_id,
+ save_file->bytes_so_far(), is_success));
save_file->Finish();
} else if (save_id == -1) {
// Before saving started, we got error. We still call finish process.
DCHECK(!save_url.is_empty());
- ui_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::OnErrorFinished,
- save_url,
- render_process_id));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ this, &SaveFileManager::OnErrorFinished, save_url,
+ render_process_id));
}
}
// Notifications sent from the file thread and run on the UI thread.
void SaveFileManager::OnStartSave(const SaveFileCreateInfo* info) {
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
SavePackage* save_package =
GetSavePackageFromRenderIds(info->render_process_id,
info->render_view_id);
@@ -357,7 +318,7 @@
void SaveFileManager::OnUpdateSaveProgress(int save_id, int64 bytes_so_far,
bool write_success) {
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
SavePackage* package = LookupPackage(save_id);
if (package)
package->UpdateSaveProgress(save_id, bytes_so_far, write_success);
@@ -368,30 +329,19 @@
void SaveFileManager::OnSaveFinished(int save_id,
int64 bytes_so_far,
bool is_success) {
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
SavePackage* package = LookupPackage(save_id);
if (package)
package->SaveFinished(save_id, bytes_so_far, is_success);
}
void SaveFileManager::OnErrorFinished(GURL save_url, int tab_id) {
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
SavePackage* save_package = UnregisterStartingRequest(save_url, tab_id);
if (save_package)
save_package->SaveFailed(save_url);
}
-void SaveFileManager::OnCancelSaveRequest(int render_process_id,
- int request_id) {
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
- DCHECK(io_loop_);
- io_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::ExecuteCancelSaveRequest,
- render_process_id,
- request_id));
-}
-
// Notifications sent from the UI thread and run on the IO thread.
void SaveFileManager::OnSaveURL(
@@ -400,7 +350,7 @@
int render_process_host_id,
int render_view_id,
URLRequestContextGetter* request_context_getter) {
- DCHECK_EQ(MessageLoop::current(), io_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
URLRequestContext* context = request_context_getter->GetURLRequestContext();
resource_dispatcher_host_->BeginSaveFile(url,
referrer,
@@ -411,22 +361,19 @@
void SaveFileManager::OnRequireSaveJobFromOtherSource(
SaveFileCreateInfo* info) {
- DCHECK_EQ(MessageLoop::current(), io_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
DCHECK_EQ(info->save_id, -1);
// Generate a unique save id.
info->save_id = GetNextId();
// Start real saving action.
- MessageLoop* loop = file_loop();
- DCHECK(loop);
- loop->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::StartSave,
- info));
+ ChromeThread::PostTask(
+ ChromeThread::FILE, FROM_HERE,
+ NewRunnableMethod(this, &SaveFileManager::StartSave, info));
}
void SaveFileManager::ExecuteCancelSaveRequest(int render_process_id,
int request_id) {
- DCHECK_EQ(MessageLoop::current(), io_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
resource_dispatcher_host_->CancelRequest(render_process_id,
request_id,
false);
@@ -440,7 +387,7 @@
// sent from the UI thread, the saving job may have already completed and
// won't exist in our map.
void SaveFileManager::CancelSave(int save_id) {
- DCHECK_EQ(MessageLoop::current(), file_loop());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
SaveFileMap::iterator it = save_file_map_.find(save_id);
if (it != save_file_map_.end()) {
SaveFile* save_file = it->second;
@@ -449,11 +396,11 @@
// message to IO thread. If the data comes from other sources, just
// ignore the cancel message.
if (save_file->save_source() == SaveFileCreateInfo::SAVE_FILE_FROM_NET) {
- ui_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::OnCancelSaveRequest,
- save_file->render_process_id(),
- save_file->request_id()));
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ this, &SaveFileManager::ExecuteCancelSaveRequest,
+ save_file->render_process_id(), save_file->request_id()));
// UI thread will notify the render process to stop sending data,
// so in here, we need not to do anything, just close the save file.
@@ -477,7 +424,7 @@
void SaveFileManager::SaveLocalFile(const GURL& original_file_url,
int save_id,
int render_process_id) {
- DCHECK_EQ(MessageLoop::current(), file_loop());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
SaveFile* save_file = LookupSaveFile(save_id);
if (!save_file)
return;
@@ -507,7 +454,7 @@
void SaveFileManager::OnDeleteDirectoryOrFile(const FilePath& full_path,
bool is_dir) {
- DCHECK_EQ(MessageLoop::current(), file_loop());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
DCHECK(!full_path.empty());
file_util::Delete(full_path, is_dir);
@@ -517,7 +464,7 @@
// We run on this thread to avoid blocking the UI with slow Shell operations.
#if !defined(OS_MACOSX)
void SaveFileManager::OnShowSavedFileInShell(const FilePath full_path) {
- DCHECK_EQ(MessageLoop::current(), file_loop());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
platform_util::ShowItemInFolder(full_path);
}
#endif
@@ -527,7 +474,7 @@
const FilePath& resource_dir,
int render_process_id,
int render_view_id) {
- DCHECK_EQ(MessageLoop::current(), file_loop());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
if (!resource_dir.empty() && !file_util::PathExists(resource_dir))
file_util::CreateDirectory(resource_dir);
@@ -544,16 +491,16 @@
}
}
- ui_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this,
- &SaveFileManager::OnFinishSavePageJob,
- render_process_id,
- render_view_id));
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(
+ this, &SaveFileManager::OnFinishSavePageJob, render_process_id,
+ render_view_id));
}
void SaveFileManager::OnFinishSavePageJob(int render_process_id,
int render_view_id) {
- DCHECK_EQ(MessageLoop::current(), ui_loop_);
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
SavePackage* save_package =
GetSavePackageFromRenderIds(render_process_id, render_view_id);
@@ -566,7 +513,7 @@
void SaveFileManager::RemoveSavedFileFromFileMap(
const SaveIDList& save_ids) {
- DCHECK_EQ(MessageLoop::current(), file_loop());
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
for (SaveIDList::const_iterator i = save_ids.begin();
i != save_ids.end(); ++i) {
« no previous file with comments | « chrome/browser/download/save_file_manager.h ('k') | chrome/browser/download/save_package.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698