Remove the need for ProcessSingletonStartupLock
authorCheng Zhao <zcbenz@gmail.com>
Thu, 22 Oct 2015 09:12:09 +0000 (17:12 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Thu, 22 Oct 2015 09:12:09 +0000 (17:12 +0800)
atom/browser/api/atom_api_app.cc
atom/browser/api/atom_api_app.h
chromium_src/chrome/browser/process_singleton_startup_lock.cc [deleted file]
chromium_src/chrome/browser/process_singleton_startup_lock.h [deleted file]
filenames.gypi

index 42feaf8..84b9301 100644 (file)
@@ -112,12 +112,20 @@ int GetPathConstant(const std::string& name) {
     return -1;
 }
 
-// Run the NotificationCallback and returns whether browser is shuting down.
 bool NotificationCallbackWrapper(
     const ProcessSingleton::NotificationCallback& callback,
-    const base::CommandLine& command_line,
-    const base::FilePath& current_directory) {
-  callback.Run(command_line, current_directory);
+    const base::CommandLine& cmd,
+    const base::FilePath& cwd) {
+  // Make sure the callback is called after app gets ready.
+  if (Browser::Get()->is_ready()) {
+    callback.Run(cmd, cwd);
+  } else {
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner(
+        base::ThreadTaskRunnerHandle::Get());
+    task_runner->PostTask(
+        FROM_HERE, base::Bind(base::IgnoreResult(callback), cmd, cwd));
+  }
+  // ProcessSingleton needs to know whether current process is quiting.
   return !Browser::Get()->is_shutting_down();
 }
 
@@ -202,9 +210,6 @@ void App::OnFinishLaunching() {
   auto handle = Session::CreateFrom(isolate(), browser_context);
   default_session_.Reset(isolate(), handle.ToV8());
 
-  if (process_singleton_startup_lock_.get())
-    process_singleton_startup_lock_->Unlock();
-
   Emit("ready");
 }
 
@@ -293,24 +298,14 @@ bool App::MakeSingleInstance(
 
   base::FilePath user_dir;
   PathService::Get(brightray::DIR_USER_DATA, &user_dir);
-
-  process_singleton_startup_lock_.reset(
-      new ProcessSingletonStartupLock(
-          base::Bind(NotificationCallbackWrapper, callback)));
-  process_singleton_.reset(
-      new ProcessSingleton(
-        user_dir,
-        process_singleton_startup_lock_->AsNotificationCallback()));
-
-  if (Browser::Get()->is_ready())
-    process_singleton_startup_lock_->Unlock();
+  process_singleton_.reset(new ProcessSingleton(
+      user_dir, base::Bind(NotificationCallbackWrapper, callback)));
 
   switch (process_singleton_->NotifyOtherProcessOrCreate()) {
     case ProcessSingleton::NotifyResult::LOCK_ERROR:
     case ProcessSingleton::NotifyResult::PROFILE_IN_USE:
     case ProcessSingleton::NotifyResult::PROCESS_NOTIFIED:
       process_singleton_.reset();
-      process_singleton_startup_lock_.reset();
       return true;
     case ProcessSingleton::NotifyResult::PROCESS_NONE:
     default:  // Shouldn't be needed, but VS warns if it is not there.
index bd87b38..94cd9bb 100644 (file)
@@ -11,7 +11,6 @@
 #include "atom/browser/browser_observer.h"
 #include "atom/common/native_mate_converters/callback.h"
 #include "chrome/browser/process_singleton.h"
-#include "chrome/browser/process_singleton_startup_lock.h"
 #include "content/public/browser/gpu_data_manager_observer.h"
 #include "native_mate/handle.h"
 
@@ -77,7 +76,6 @@ class App : public mate::EventEmitter,
   v8::Global<v8::Value> default_session_;
 
   scoped_ptr<ProcessSingleton> process_singleton_;
-  scoped_ptr<ProcessSingletonStartupLock> process_singleton_startup_lock_;
 
   DISALLOW_COPY_AND_ASSIGN(App);
 };
diff --git a/chromium_src/chrome/browser/process_singleton_startup_lock.cc b/chromium_src/chrome/browser/process_singleton_startup_lock.cc
deleted file mode 100644 (file)
index f564de7..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/process_singleton_startup_lock.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-
-ProcessSingletonStartupLock::ProcessSingletonStartupLock(
-    const ProcessSingleton::NotificationCallback& original_callback)
-    : locked_(true),
-      original_callback_(original_callback) {}
-
-ProcessSingletonStartupLock::~ProcessSingletonStartupLock() {}
-
-ProcessSingleton::NotificationCallback
-ProcessSingletonStartupLock::AsNotificationCallback() {
-  return base::Bind(&ProcessSingletonStartupLock::NotificationCallbackImpl,
-                    base::Unretained(this));
-}
-
-void ProcessSingletonStartupLock::Unlock() {
-  DCHECK(CalledOnValidThread());
-  locked_ = false;
-
-  // Replay the command lines of the messages which were received while the
-  // ProcessSingleton was locked. Only replay each message once.
-  std::set<DelayedStartupMessage> replayed_messages;
-  for (std::vector<DelayedStartupMessage>::const_iterator it =
-           saved_startup_messages_.begin();
-       it != saved_startup_messages_.end(); ++it) {
-    if (replayed_messages.find(*it) != replayed_messages.end())
-      continue;
-    original_callback_.Run(base::CommandLine(it->first), it->second);
-    replayed_messages.insert(*it);
-  }
-  saved_startup_messages_.clear();
-}
-
-bool ProcessSingletonStartupLock::NotificationCallbackImpl(
-    const base::CommandLine& command_line,
-    const base::FilePath& current_directory) {
-  if (locked_) {
-    // If locked, it means we are not ready to process this message because
-    // we are probably in a first run critical phase.
-    saved_startup_messages_.push_back(
-        std::make_pair(command_line.argv(), current_directory));
-    return true;
-  } else {
-    return original_callback_.Run(command_line, current_directory);
-  }
-}
diff --git a/chromium_src/chrome/browser/process_singleton_startup_lock.h b/chromium_src/chrome/browser/process_singleton_startup_lock.h
deleted file mode 100644 (file)
index 187dd35..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_PROCESS_SINGLETON_STARTUP_LOCK_H_
-#define CHROME_BROWSER_PROCESS_SINGLETON_STARTUP_LOCK_H_
-
-#include <set>
-#include <utility>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/threading/non_thread_safe.h"
-#include "chrome/browser/process_singleton.h"
-
-// Provides a ProcessSingleton::NotificationCallback that can queue up
-// command-line invocations during startup and execute them when startup
-// completes.
-//
-// The object starts in a locked state. |Unlock()| must be called
-// when the process is prepared to handle command-line invocations.
-//
-// Once unlocked, notifications are forwarded to a wrapped NotificationCallback.
-class ProcessSingletonStartupLock : public base::NonThreadSafe {
- public:
-  explicit ProcessSingletonStartupLock(
-      const ProcessSingleton::NotificationCallback& original_callback);
-  ~ProcessSingletonStartupLock();
-
-  // Returns the ProcessSingleton::NotificationCallback.
-  // The callback is only valid during the lifetime of the
-  // ProcessSingletonStartupLock instance.
-  ProcessSingleton::NotificationCallback AsNotificationCallback();
-
-  // Executes previously queued command-line invocations and allows future
-  // invocations to be executed immediately.
-  void Unlock();
-
-  bool locked() { return locked_; }
-
- private:
-  typedef std::pair<base::CommandLine::StringVector, base::FilePath>
-      DelayedStartupMessage;
-
-  bool NotificationCallbackImpl(const base::CommandLine& command_line,
-                                const base::FilePath& current_directory);
-
-  bool locked_;
-  std::vector<DelayedStartupMessage> saved_startup_messages_;
-  ProcessSingleton::NotificationCallback original_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(ProcessSingletonStartupLock);
-};
-
-#endif  // CHROME_BROWSER_PROCESS_SINGLETON_STARTUP_LOCK_H_
index ec7ab32..1c52cf5 100644 (file)
       'chromium_src/chrome/browser/browser_process.cc',
       'chromium_src/chrome/browser/browser_process.h',
       'chromium_src/chrome/browser/chrome_process_finder_win.cc',
+      'chromium_src/chrome/browser/chrome_process_finder_win.h',
       'chromium_src/chrome/browser/chrome_notification_types.h',
       'chromium_src/chrome/browser/extensions/global_shortcut_listener.cc',
       'chromium_src/chrome/browser/extensions/global_shortcut_listener.h',
       'chromium_src/chrome/browser/printing/print_preview_message_handler.cc',
       'chromium_src/chrome/browser/printing/print_preview_message_handler.h',
       'chromium_src/chrome/browser/process_singleton_posix.cc',
-      'chromium_src/chrome/browser/process_singleton_startup_lock.cc',
       'chromium_src/chrome/browser/process_singleton_win.cc',
+      'chromium_src/chrome/browser/process_singleton.h',
       'chromium_src/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc',
       'chromium_src/chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h',
       'chromium_src/chrome/browser/renderer_host/pepper/pepper_broker_message_filter.cc',