OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef BASE_WIN_SCOPED_PROCESS_INFORMATION_H_ | 5 #ifndef BASE_WIN_SCOPED_PROCESS_INFORMATION_H_ |
6 #define BASE_WIN_SCOPED_PROCESS_INFORMATION_H_ | 6 #define BASE_WIN_SCOPED_PROCESS_INFORMATION_H_ |
7 | 7 |
8 #include <windows.h> | 8 #include <windows.h> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
11 #include "base/base_export.h" | 11 #include "base/base_export.h" |
12 #include "base/win/scoped_handle.h" | 12 #include "base/win/scoped_handle.h" |
13 | 13 |
14 namespace base { | 14 namespace base { |
15 namespace win { | 15 namespace win { |
16 | 16 |
17 // Manages the closing of process and thread handles from PROCESS_INFORMATION | 17 // Manages the closing of process and thread handles from PROCESS_INFORMATION |
18 // structures. Allows clients to take ownership of either handle independently. | 18 // structures. Allows clients to take ownership of either handle independently. |
19 class BASE_EXPORT ScopedProcessInformation { | 19 class BASE_EXPORT ScopedProcessInformation { |
20 public: | 20 public: |
| 21 // Helper object to contain the effect of Receive() to the funtion that needs |
| 22 // a pointer. |
| 23 class Receiver { |
| 24 public: |
| 25 explicit Receiver(ScopedProcessInformation* owner) |
| 26 : info_(), |
| 27 owner_(owner) {} |
| 28 ~Receiver() { owner_->Set(info_); } |
| 29 |
| 30 operator PROCESS_INFORMATION*() { return &info_; } |
| 31 |
| 32 private: |
| 33 PROCESS_INFORMATION info_; |
| 34 ScopedProcessInformation* owner_; |
| 35 }; |
| 36 |
21 ScopedProcessInformation(); | 37 ScopedProcessInformation(); |
22 explicit ScopedProcessInformation(const PROCESS_INFORMATION& process_info); | |
23 ~ScopedProcessInformation(); | 38 ~ScopedProcessInformation(); |
24 | 39 |
| 40 // Returns an object that may be passed to API calls such as CreateProcess. |
| 41 // DCHECKs that the object is not currently holding any handles. |
| 42 // HANDLEs stored in the returned PROCESS_INFORMATION will be owned by this |
| 43 // instance. |
| 44 // The intended use case is something like this: |
| 45 // if (::CreateProcess(..., startup_info, scoped_proces_info.Receive())) |
| 46 Receiver Receive(); |
| 47 |
25 // Returns true iff this instance is holding a thread and/or process handle. | 48 // Returns true iff this instance is holding a thread and/or process handle. |
26 bool IsValid() const; | 49 bool IsValid() const; |
27 | 50 |
28 // Closes the held thread and process handles, if any. | 51 // Closes the held thread and process handles, if any. |
29 void Close(); | 52 void Close(); |
30 | 53 |
31 // Populates this instance with the provided |process_info|. | 54 // Populates this instance with the provided |process_info|. |
32 void Set(const PROCESS_INFORMATION& process_info); | 55 void Set(const PROCESS_INFORMATION& process_info); |
33 | 56 |
34 // Populates this instance with duplicate handles and the thread/process IDs | 57 // Populates this instance with duplicate handles and the thread/process IDs |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 DWORD process_id_; | 97 DWORD process_id_; |
75 DWORD thread_id_; | 98 DWORD thread_id_; |
76 | 99 |
77 DISALLOW_COPY_AND_ASSIGN(ScopedProcessInformation); | 100 DISALLOW_COPY_AND_ASSIGN(ScopedProcessInformation); |
78 }; | 101 }; |
79 | 102 |
80 } // namespace win | 103 } // namespace win |
81 } // namespace base | 104 } // namespace base |
82 | 105 |
83 #endif // BASE_WIN_SCOPED_PROCESS_INFORMATION_H_ | 106 #endif // BASE_WIN_SCOPED_PROCESS_INFORMATION_H_ |
OLD | NEW |