// Copyright (c) 2010 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/common/service_process_util_posix.h" #include <signal.h> #include <unistd.h> #include "base/command_line.h" #include "base/file_util.h" #include "base/logging.h" #include "base/threading/platform_thread.h" #include "chrome/common/auto_start_linux.h" #include "chrome/common/multi_process_lock.h" namespace { // Attempts to take a lock named |name|. If |waiting| is true then this will // make multiple attempts to acquire the lock. // Caller is responsible for ownership of the MultiProcessLock. MultiProcessLock* TakeNamedLock(const std::string& name, bool waiting) { scoped_ptr<MultiProcessLock> lock(MultiProcessLock::Create(name)); if (lock == NULL) return NULL; bool got_lock = false; for (int i = 0; i < 10; ++i) { if (lock->TryLock()) { got_lock = true; break; } if (!waiting) break; base::PlatformThread::Sleep(100 * i); } if (!got_lock) { lock.reset(); } return lock.release(); } MultiProcessLock* TakeServiceInitializingLock(bool waiting) { std::string lock_name = GetServiceProcessScopedName("_service_initializing"); return TakeNamedLock(lock_name, waiting); } std::string GetBaseDesktopName() { #if defined(GOOGLE_CHROME_BUILD) return "google-chrome-service.desktop"; #else // CHROMIUM_BUILD return "chromium-service.desktop"; #endif } } // namespace MultiProcessLock* TakeServiceRunningLock(bool waiting) { std::string lock_name = GetServiceProcessScopedName("_service_running"); return TakeNamedLock(lock_name, waiting); } bool ForceServiceProcessShutdown(const std::string& version, base::ProcessId process_id) { if (kill(process_id, SIGTERM) < 0) { PLOG(ERROR) << "kill"; return false; } return true; } bool CheckServiceProcessReady() { scoped_ptr<MultiProcessLock> running_lock(TakeServiceRunningLock(false)); return running_lock.get() == NULL; } bool ServiceProcessState::TakeSingletonLock() { state_->initializing_lock_.reset(TakeServiceInitializingLock(true)); return state_->initializing_lock_.get(); } bool ServiceProcessState::AddToAutoRun() { DCHECK(autorun_command_line_.get()); #if defined(GOOGLE_CHROME_BUILD) std::string app_name = "Google Chrome Service"; #else // CHROMIUM_BUILD std::string app_name = "Chromium Service"; #endif return AutoStart::AddApplication( GetServiceProcessScopedName(GetBaseDesktopName()), app_name, autorun_command_line_->command_line_string(), false); } bool ServiceProcessState::RemoveFromAutoRun() { return AutoStart::Remove( GetServiceProcessScopedName(GetBaseDesktopName())); }