1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef BASE_PROCESS_H_ 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define BASE_PROCESS_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/base_api.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "build/build_config.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <sys/types.h> 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h> 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base { 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ProcessHandle is a platform specific type which represents the underlying OS 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// handle to a process. 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// ProcessId is a number which identifies the process in the OS. 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN) 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef HANDLE ProcessHandle; 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef DWORD ProcessId; 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef HANDLE UserTokenHandle; 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst ProcessHandle kNullProcessHandle = NULL; 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst ProcessId kNullProcessId = 0; 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX) 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// On POSIX, our ProcessHandle will just be the PID. 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef pid_t ProcessHandle; 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef pid_t ProcessId; 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst ProcessHandle kNullProcessHandle = 0; 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst ProcessId kNullProcessId = 0; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // defined(OS_WIN) 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_POSIX) && !defined(OS_MACOSX) 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// saved_priority_ will be set to this to indicate that it's not holding 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// a valid value. -20 to 19 are valid process priorities. 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst int kUnsetProcessPriority = 256; 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass BASE_API Process { 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Process() : process_(kNullProcessHandle) { 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_POSIX) && !defined(OS_MACOSX) 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott saved_priority_ = kUnsetProcessPriority; 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott explicit Process(ProcessHandle handle) : process_(handle) { 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_POSIX) && !defined(OS_MACOSX) 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott saved_priority_ = kUnsetProcessPriority; 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // A handle to the current process. 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Process Current(); 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Get/Set the handle for this process. The handle will be 0 if the process 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // is no longer running. 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProcessHandle handle() const { return process_; } 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void set_handle(ProcessHandle handle) { 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott process_ = handle; 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_POSIX) && !defined(OS_MACOSX) 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott saved_priority_ = kUnsetProcessPriority; 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Get the PID for this process. 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProcessId pid() const; 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Is the this process the current process. 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool is_current() const; 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Close the process handle. This will not terminate the process. 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void Close(); 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Terminates the process with extreme prejudice. The given result code will 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // be the exit code of the process. If the process has already exited, this 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // will do nothing. 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void Terminate(int result_code); 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // A process is backgrounded when it's priority is lower than normal. 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Return true if this process is backgrounded, false otherwise. 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool IsProcessBackgrounded() const; 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Set a process as backgrounded. If value is true, the priority 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // of the process will be lowered. If value is false, the priority 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // of the process will be made "normal" - equivalent to default 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // process priority. 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns true if the priority was changed, false otherwise. 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool SetProcessBackgrounded(bool value); 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Returns an integer representing the priority of a process. The meaning 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // of this value is OS dependent. 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int GetPriority() const; 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProcessHandle process_; 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_POSIX) && !defined(OS_MACOSX) 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Holds the priority that the process was set to when it was backgrounded. 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // If the process wasn't backgrounded it will be kUnsetProcessPriority. 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int saved_priority_; 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace base 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif // BASE_PROCESS_H_ 111