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

Unified Diff: chrome/browser/chromeos/cros/login_library.cc

Issue 6713032: Provide lazy CommitPendingWrites in addition to eager SavePersistentPrefs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: removed notification + rebase Created 9 years, 9 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/cros/login_library.cc
diff --git a/chrome/browser/chromeos/cros/login_library.cc b/chrome/browser/chromeos/cros/login_library.cc
index 026757f3b92226b9bdf99ae76e2eb3993e401f2f..f8c58296aeaff14b6c455966e93efcb7c0b0c10d 100644
--- a/chrome/browser/chromeos/cros/login_library.cc
+++ b/chrome/browser/chromeos/cros/login_library.cc
@@ -5,6 +5,8 @@
#include "chrome/browser/chromeos/cros/login_library.h"
#include "base/message_loop.h"
+#include "base/task.h"
+#include "base/timer.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/cros/cros_library.h"
#include "chrome/browser/chromeos/login/signed_settings_temp_storage.h"
@@ -18,12 +20,14 @@ namespace chromeos {
class LoginLibraryImpl : public LoginLibrary {
public:
LoginLibraryImpl()
- : set_owner_key_callback_(NULL),
+ : job_restart_request_(NULL),
+ set_owner_key_callback_(NULL),
whitelist_op_callback_(NULL),
property_op_callback_(NULL) {
if (CrosLibrary::Get()->EnsureLoaded())
Init();
}
+
virtual ~LoginLibraryImpl() {
if (session_connection_) {
chromeos::DisconnectSession(session_connection_);
@@ -131,16 +135,59 @@ class LoginLibraryImpl : public LoginLibrary {
}
bool RestartJob(int pid, const std::string& command_line) {
- if (g_browser_process && g_browser_process->local_state()) {
- // XXX: normally this call must not be needed, however it turned out that
- // without this explicit call to SavePersistentPrefs it is possible for
- // preferences to be lost. See http://crosbug.com/13102
- g_browser_process->local_state()->SavePersistentPrefs();
+ if (job_restart_request_) {
+ NOTREACHED();
+ return false;
}
- return chromeos::RestartJob(pid, command_line.c_str());
+ job_restart_request_ = new JobRestartRequest(pid, command_line);
+ return true;
}
private:
+ class JobRestartRequest
+ : public base::RefCountedThreadSafe<JobRestartRequest> {
+ public:
+ JobRestartRequest(int pid, const std::string& command_line)
+ : pid_(pid),
+ command_line_(command_line),
+ local_state_(g_browser_process->local_state()) {
+ AddRef();
+ if (local_state_) {
+ // XXX: normally this call must not be needed, however RestartJob
+ // just kills us so settings may be lost. See http://crosbug.com/13102
+ local_state_->CommitPendingWrite();
+ timer_.Start(
+ base::TimeDelta::FromSeconds(3), this,
+ &JobRestartRequest::RestartJob);
+ // Post task on file thread thus it occurs last on task queue, so it
+ // would be executed after committing pending write on file thread.
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ NewRunnableMethod(this, &JobRestartRequest::RestartJob));
+ } else {
+ RestartJob();
+ }
+ }
+
+ private:
+ void RestartJob() {
+ if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
+ if (!chromeos::RestartJob(pid_, command_line_.c_str()))
+ NOTREACHED();
+ } else {
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ NewRunnableMethod(this, &JobRestartRequest::RestartJob));
+ MessageLoop::current()->AssertIdle();
+ }
+ }
+
+ int pid_;
+ std::string command_line_;
+ PrefService* local_state_;
+ base::OneShotTimer<JobRestartRequest> timer_;
+ };
+
static void Handler(void* object, const OwnershipEvent& event) {
LoginLibraryImpl* self = static_cast<LoginLibraryImpl*>(object);
switch (event) {
@@ -208,6 +255,7 @@ class LoginLibraryImpl : public LoginLibrary {
}
chromeos::SessionConnection session_connection_;
+ JobRestartRequest* job_restart_request_;
Delegate* set_owner_key_callback_;
Delegate* whitelist_op_callback_;
« no previous file with comments | « no previous file | chrome/browser/chromeos/login/owner_manager.cc » ('j') | chrome/common/important_file_writer.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698