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