From 42f635ff789f5d18f5ace99b011b2aa8aa895db3 Mon Sep 17 00:00:00 2001 From: Garrett Robinson Date: Fri, 14 Dec 2018 15:47:36 -0800 Subject: [PATCH] Handle stale Muon lockfiles on macOS and Linux --- .../brave_external_process_importer_host.cc | 1 + browser/importer/brave_profile_lock.cc | 19 +++++++++++++++++++ browser/importer/brave_profile_lock.h | 2 ++ browser/importer/chrome_profile_lock.cc | 10 +++++----- browser/importer/chrome_profile_lock.h | 5 +++-- .../importer/chrome_profile_lock_unittest.cc | 2 ++ 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/browser/importer/brave_external_process_importer_host.cc b/browser/importer/brave_external_process_importer_host.cc index 6568fed5dada..4410d724d3ed 100644 --- a/browser/importer/brave_external_process_importer_host.cc +++ b/browser/importer/brave_external_process_importer_host.cc @@ -106,6 +106,7 @@ bool BraveExternalProcessImporterHost::CheckForChromeOrBraveLock() { browser_lock_.reset(new BraveProfileLock(source_profile_.source_path)); } + browser_lock_->Lock(); if (browser_lock_->HasAcquired()) return true; diff --git a/browser/importer/brave_profile_lock.cc b/browser/importer/brave_profile_lock.cc index 739092cded31..11b060d406c7 100644 --- a/browser/importer/brave_profile_lock.cc +++ b/browser/importer/brave_profile_lock.cc @@ -4,8 +4,27 @@ #include "brave/browser/importer/brave_profile_lock.h" +#include "build/build_config.h" +#include "base/logging.h" +#include "base/threading/thread_restrictions.h" + BraveProfileLock::BraveProfileLock( const base::FilePath& user_data_dir) : ChromeProfileLock(user_data_dir) {} BraveProfileLock::~BraveProfileLock() {} + +void BraveProfileLock::Lock() { +#if defined(OS_WIN) + ChromeProfileLock::Lock(); +#elif defined(OS_POSIX) + base::ThreadRestrictions::ScopedAllowIO allow_io; + if (HasAcquired()) + return; + + ProcessSingleton::NotifyResult rv = + process_singleton_->NotifyOtherProcessOrCreate(); + LOG(INFO) << "BraveProfileLock::Lock: NotifyOtherProcessOrCreate rv: " << rv; + lock_acquired_ = rv == ProcessSingleton::PROCESS_NONE; +#endif +} diff --git a/browser/importer/brave_profile_lock.h b/browser/importer/brave_profile_lock.h index 0932e057231a..ef332d985178 100644 --- a/browser/importer/brave_profile_lock.h +++ b/browser/importer/brave_profile_lock.h @@ -12,6 +12,8 @@ class BraveProfileLock : public ChromeProfileLock { public: explicit BraveProfileLock(const base::FilePath& user_data_dir); ~BraveProfileLock() override; + + void Lock() override; }; #endif // BRAVE_BROWSER_IMPORTER_BRAVE_PROFILE_LOCK_H__ diff --git a/browser/importer/chrome_profile_lock.cc b/browser/importer/chrome_profile_lock.cc index 39f61ba4a868..9b72e45a1984 100644 --- a/browser/importer/chrome_profile_lock.cc +++ b/browser/importer/chrome_profile_lock.cc @@ -6,17 +6,17 @@ #include "base/bind.h" #include "base/bind_helpers.h" +#include "base/logging.h" #include "base/threading/thread_restrictions.h" +#include "chrome/browser/process_singleton.h" ChromeProfileLock::ChromeProfileLock( const base::FilePath& user_data_dir) : lock_acquired_(false), - user_data_dir_(user_data_dir), process_singleton_(new ProcessSingleton(user_data_dir, - base::Bind(&ChromeProfileLock::NotificationCallback, - base::Unretained(this)))) { - Lock(); -} + base::Bind(&ChromeProfileLock::NotificationCallback, + base::Unretained(this)))), + user_data_dir_(user_data_dir) {} ChromeProfileLock::~ChromeProfileLock() { Unlock(); diff --git a/browser/importer/chrome_profile_lock.h b/browser/importer/chrome_profile_lock.h index d29e2ba21459..fb81e64e06f9 100644 --- a/browser/importer/chrome_profile_lock.h +++ b/browser/importer/chrome_profile_lock.h @@ -22,11 +22,12 @@ class ChromeProfileLock : public BrowserProfileLock { // Returns true if we lock the profile successfully. bool HasAcquired() override; - private: + protected: bool lock_acquired_; - base::FilePath user_data_dir_; std::unique_ptr process_singleton_; + private: + base::FilePath user_data_dir_; bool NotificationCallback(const base::CommandLine& command_line, const base::FilePath& current_directory); diff --git a/browser/importer/chrome_profile_lock_unittest.cc b/browser/importer/chrome_profile_lock_unittest.cc index 5eb919d27935..d91ecb807046 100644 --- a/browser/importer/chrome_profile_lock_unittest.cc +++ b/browser/importer/chrome_profile_lock_unittest.cc @@ -75,6 +75,7 @@ void ChromeProfileLockTest::LockFileExists(bool expect) { TEST_F(ChromeProfileLockTest, LockTest) { ChromeProfileLock lock(user_data_path_); + lock.Lock(); ASSERT_TRUE(lock.HasAcquired()); lock.Unlock(); ASSERT_FALSE(lock.HasAcquired()); @@ -89,6 +90,7 @@ TEST_F(ChromeProfileLockTest, ProfileLock) { EXPECT_EQ(static_cast(NULL), lock.get()); LockFileExists(false); lock.reset(new ChromeProfileLock(user_data_path_)); + lock->Lock(); EXPECT_TRUE(lock->HasAcquired()); LockFileExists(true); lock->Unlock();