Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/process_singleton_startup_lock.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/logging.h"
      9 
     10 ProcessSingletonStartupLock::ProcessSingletonStartupLock(
     11     const ProcessSingleton::NotificationCallback& original_callback)
     12     : locked_(true),
     13       original_callback_(original_callback) {}
     14 
     15 ProcessSingletonStartupLock::~ProcessSingletonStartupLock() {}
     16 
     17 ProcessSingleton::NotificationCallback
     18 ProcessSingletonStartupLock::AsNotificationCallback() {
     19   return base::Bind(&ProcessSingletonStartupLock::NotificationCallbackImpl,
     20                     base::Unretained(this));
     21 }
     22 
     23 void ProcessSingletonStartupLock::Unlock() {
     24   DCHECK(CalledOnValidThread());
     25   locked_ = false;
     26 
     27   // Replay the command lines of the messages which were received while the
     28   // ProcessSingleton was locked. Only replay each message once.
     29   std::set<DelayedStartupMessage> replayed_messages;
     30   for (std::vector<DelayedStartupMessage>::const_iterator it =
     31            saved_startup_messages_.begin();
     32        it != saved_startup_messages_.end(); ++it) {
     33     if (replayed_messages.find(*it) != replayed_messages.end())
     34       continue;
     35     original_callback_.Run(CommandLine(it->first), it->second);
     36     replayed_messages.insert(*it);
     37   }
     38   saved_startup_messages_.clear();
     39 }
     40 
     41 bool ProcessSingletonStartupLock::NotificationCallbackImpl(
     42     const CommandLine& command_line,
     43     const base::FilePath& current_directory) {
     44   if (locked_) {
     45     // If locked, it means we are not ready to process this message because
     46     // we are probably in a first run critical phase.
     47     saved_startup_messages_.push_back(
     48         std::make_pair(command_line.argv(), current_directory));
     49     return true;
     50   } else {
     51     return original_callback_.Run(command_line, current_directory);
     52   }
     53 }
     54