Index: base/process/process.h |
diff --git a/base/process/process.h b/base/process/process.h |
index 20e8884b9720f04fad879980107c14a9a3951f31..701947491d7497a29ed2dfac754d0fd96e969083 100644 |
--- a/base/process/process.h |
+++ b/base/process/process.h |
@@ -7,53 +7,81 @@ |
#include "base/base_export.h" |
#include "base/basictypes.h" |
+#include "base/move.h" |
#include "base/process/process_handle.h" |
#include "build/build_config.h" |
+#if defined(OS_WIN) |
+#include "base/win/scoped_handle.h" |
+#endif |
+ |
namespace base { |
+// Provides a move-only encapsulation of a process. |
+// |
+// This object is not tied to the lifetime of the underlying process: the |
+// process may be killed and this object may still around, and it will still |
+// claim to be valid. The actual behavior in that case is OS dependent like so: |
+// |
+// Windows: The underlying ProcessHandle will be valid after the process dies |
+// and can be used to gather some information about that process, but most |
+// methods will obviously fail. |
+// |
+// POSIX: The underlying PorcessHandle is not guaranteed to remain valid after |
+// the process dies, and it may be reused by the system, which means that it may |
+// end up pointing to the wrong process. |
class BASE_EXPORT Process { |
+ MOVE_ONLY_TYPE_FOR_CPP_03(Process, RValue) |
+ |
public: |
- Process() : process_(kNullProcessHandle) { |
- } |
+ explicit Process(ProcessHandle handle = kNullProcessHandle); |
+ |
+ // Move constructor for C++03 move emulation of this type. |
+ Process(RValue other); |
- explicit Process(ProcessHandle handle) : process_(handle) { |
- } |
+ // The destructor does not terminate the process. |
+ ~Process() {} |
- // A handle to the current process. |
+ // Move operator= for C++03 move emulation of this type. |
+ Process& operator=(RValue other); |
+ |
+ // Returns an object for the current process. |
static Process Current(); |
+ // Returns true if processes can be backgrounded. |
static bool CanBackgroundProcesses(); |
- // Get/Set the handle for this process. The handle will be 0 if the process |
- // is no longer running. |
- ProcessHandle handle() const { return process_; } |
- void set_handle(ProcessHandle handle) { |
- process_ = handle; |
- } |
+ // Returns true if this objects represents a valid process. |
+ bool IsValid() const; |
+ |
+ // Returns a handle for this process. There is no guarantee about when that |
+ // handle becomes invalid because this object retains ownership. |
+ ProcessHandle Handle() const; |
+ |
+ // Returns a second object that represents this process. |
+ Process Duplicate() const; |
// Get the PID for this process. |
ProcessId pid() const; |
- // Is the this process the current process. |
+ // Returns true if this process is the current process. |
bool is_current() const; |
// Close the process handle. This will not terminate the process. |
void Close(); |
- // Terminates the process with extreme prejudice. The given result code will |
- // be the exit code of the process. If the process has already exited, this |
- // will do nothing. |
+ // Terminates the process with extreme prejudice. The given |result_code| will |
+ // be the exit code of the process. |
+ // NOTE: On POSIX |result_code| is ignored. |
void Terminate(int result_code); |
// A process is backgrounded when it's priority is lower than normal. |
// Return true if this process is backgrounded, false otherwise. |
bool IsProcessBackgrounded() const; |
- // Set a process as backgrounded. If value is true, the priority |
- // of the process will be lowered. If value is false, the priority |
- // of the process will be made "normal" - equivalent to default |
- // process priority. |
+ // Set a process as backgrounded. If value is true, the priority of the |
+ // process will be lowered. If value is false, the priority of the process |
+ // will be made "normal" - equivalent to default process priority. |
// Returns true if the priority was changed, false otherwise. |
bool SetProcessBackgrounded(bool value); |
@@ -62,7 +90,12 @@ class BASE_EXPORT Process { |
int GetPriority() const; |
private: |
+#if defined(OS_WIN) |
+ bool is_current_process_; |
+ win::ScopedHandle process_; |
+#else |
ProcessHandle process_; |
+#endif |
}; |
} // namespace base |