Home | History | Annotate | Download | only in common
      1 // Copyright (c) 2010 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/common/service_process_util_posix.h"
      6 
      7 #include <signal.h>
      8 #include <unistd.h>
      9 
     10 #include "base/command_line.h"
     11 #include "base/file_util.h"
     12 #include "base/logging.h"
     13 #include "base/threading/platform_thread.h"
     14 #include "chrome/common/auto_start_linux.h"
     15 #include "chrome/common/multi_process_lock.h"
     16 
     17 namespace {
     18 
     19 // Attempts to take a lock named |name|. If |waiting| is true then this will
     20 // make multiple attempts to acquire the lock.
     21 // Caller is responsible for ownership of the MultiProcessLock.
     22 MultiProcessLock* TakeNamedLock(const std::string& name, bool waiting) {
     23   scoped_ptr<MultiProcessLock> lock(MultiProcessLock::Create(name));
     24   if (lock == NULL) return NULL;
     25   bool got_lock = false;
     26   for (int i = 0; i < 10; ++i) {
     27     if (lock->TryLock()) {
     28       got_lock = true;
     29       break;
     30     }
     31     if (!waiting) break;
     32     base::PlatformThread::Sleep(100 * i);
     33   }
     34   if (!got_lock) {
     35     lock.reset();
     36   }
     37   return lock.release();
     38 }
     39 
     40 MultiProcessLock* TakeServiceInitializingLock(bool waiting) {
     41   std::string lock_name =
     42       GetServiceProcessScopedName("_service_initializing");
     43   return TakeNamedLock(lock_name, waiting);
     44 }
     45 
     46 std::string GetBaseDesktopName() {
     47 #if defined(GOOGLE_CHROME_BUILD)
     48   return "google-chrome-service.desktop";
     49 #else  // CHROMIUM_BUILD
     50   return "chromium-service.desktop";
     51 #endif
     52 }
     53 }  // namespace
     54 
     55 MultiProcessLock* TakeServiceRunningLock(bool waiting) {
     56   std::string lock_name =
     57       GetServiceProcessScopedName("_service_running");
     58   return TakeNamedLock(lock_name, waiting);
     59 }
     60 
     61 bool ForceServiceProcessShutdown(const std::string& version,
     62                                  base::ProcessId process_id) {
     63   if (kill(process_id, SIGTERM) < 0) {
     64     PLOG(ERROR) << "kill";
     65     return false;
     66   }
     67   return true;
     68 }
     69 
     70 bool CheckServiceProcessReady() {
     71   scoped_ptr<MultiProcessLock> running_lock(TakeServiceRunningLock(false));
     72   return running_lock.get() == NULL;
     73 }
     74 
     75 bool ServiceProcessState::TakeSingletonLock() {
     76   state_->initializing_lock_.reset(TakeServiceInitializingLock(true));
     77   return state_->initializing_lock_.get();
     78 }
     79 
     80 bool ServiceProcessState::AddToAutoRun() {
     81   DCHECK(autorun_command_line_.get());
     82 #if defined(GOOGLE_CHROME_BUILD)
     83   std::string app_name = "Google Chrome Service";
     84 #else  // CHROMIUM_BUILD
     85   std::string app_name = "Chromium Service";
     86 #endif
     87   return AutoStart::AddApplication(
     88       GetServiceProcessScopedName(GetBaseDesktopName()),
     89       app_name,
     90       autorun_command_line_->command_line_string(),
     91       false);
     92 }
     93 
     94 bool ServiceProcessState::RemoveFromAutoRun() {
     95   return AutoStart::Remove(
     96       GetServiceProcessScopedName(GetBaseDesktopName()));
     97 }
     98