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_HANDLE_H_ | 5 #ifndef BASE_WIN_SCOPED_HANDLE_H_ |
6 #define BASE_WIN_SCOPED_HANDLE_H_ | 6 #define BASE_WIN_SCOPED_HANDLE_H_ |
7 | 7 |
8 #include <windows.h> | 8 #include <windows.h> |
9 | 9 |
10 #include "base/base_export.h" | 10 #include "base/base_export.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 } | 94 } |
95 return temp; | 95 return temp; |
96 } | 96 } |
97 | 97 |
98 // Explicitly closes the owned handle. | 98 // Explicitly closes the owned handle. |
99 void Close() { | 99 void Close() { |
100 if (Traits::IsHandleValid(handle_)) { | 100 if (Traits::IsHandleValid(handle_)) { |
101 Verifier::StopTracking(handle_, this, BASE_WIN_GET_CALLER, | 101 Verifier::StopTracking(handle_, this, BASE_WIN_GET_CALLER, |
102 tracked_objects::GetProgramCounter()); | 102 tracked_objects::GetProgramCounter()); |
103 | 103 |
104 if (!Traits::CloseHandle(handle_)) | 104 Traits::CloseHandle(handle_); |
105 CHECK(false); | |
106 | |
107 handle_ = Traits::NullHandle(); | 105 handle_ = Traits::NullHandle(); |
108 } | 106 } |
109 } | 107 } |
110 | 108 |
111 private: | 109 private: |
112 Handle handle_; | 110 Handle handle_; |
113 }; | 111 }; |
114 | 112 |
115 #undef BASE_WIN_GET_CALLER | 113 #undef BASE_WIN_GET_CALLER |
116 | 114 |
117 // The traits class for Win32 handles that can be closed via CloseHandle() API. | 115 // The traits class for Win32 handles that can be closed via CloseHandle() API. |
118 class HandleTraits { | 116 class HandleTraits { |
119 public: | 117 public: |
120 typedef HANDLE Handle; | 118 typedef HANDLE Handle; |
121 | 119 |
122 // Closes the handle. | 120 // Closes the handle. |
123 static bool CloseHandle(HANDLE handle) { | 121 static bool BASE_EXPORT CloseHandle(HANDLE handle); |
124 return ::CloseHandle(handle) != FALSE; | |
125 } | |
126 | 122 |
127 // Returns true if the handle value is valid. | 123 // Returns true if the handle value is valid. |
128 static bool IsHandleValid(HANDLE handle) { | 124 static bool IsHandleValid(HANDLE handle) { |
129 return handle != NULL && handle != INVALID_HANDLE_VALUE; | 125 return handle != NULL && handle != INVALID_HANDLE_VALUE; |
130 } | 126 } |
131 | 127 |
132 // Returns NULL handle value. | 128 // Returns NULL handle value. |
133 static HANDLE NullHandle() { | 129 static HANDLE NullHandle() { |
134 return NULL; | 130 return NULL; |
135 } | 131 } |
(...skipping 25 matching lines...) Expand all Loading... |
161 const void* pc1, const void* pc2); | 157 const void* pc1, const void* pc2); |
162 static void StopTracking(HANDLE handle, const void* owner, | 158 static void StopTracking(HANDLE handle, const void* owner, |
163 const void* pc1, const void* pc2); | 159 const void* pc1, const void* pc2); |
164 | 160 |
165 private: | 161 private: |
166 DISALLOW_IMPLICIT_CONSTRUCTORS(VerifierTraits); | 162 DISALLOW_IMPLICIT_CONSTRUCTORS(VerifierTraits); |
167 }; | 163 }; |
168 | 164 |
169 typedef GenericScopedHandle<HandleTraits, VerifierTraits> ScopedHandle; | 165 typedef GenericScopedHandle<HandleTraits, VerifierTraits> ScopedHandle; |
170 | 166 |
| 167 // This function may be called by the embedder to disable the use of |
| 168 // VerifierTraits at runtime. It has no effect if DummyVerifierTraits is used |
| 169 // for ScopedHandle. |
| 170 void BASE_EXPORT DisableHandleVerifier(); |
| 171 |
| 172 // This should be called whenever the OS is closing a handle, if extended |
| 173 // verification of improper handle closing is desired. If |handle| is being |
| 174 // tracked by the handle verifier and ScopedHandle is not the one closing it, |
| 175 // a CHECK is generated. |
| 176 void BASE_EXPORT OnHandleBeingClosed(HANDLE handle); |
| 177 |
171 } // namespace win | 178 } // namespace win |
172 } // namespace base | 179 } // namespace base |
173 | 180 |
174 #endif // BASE_SCOPED_HANDLE_WIN_H_ | 181 #endif // BASE_SCOPED_HANDLE_WIN_H_ |
OLD | NEW |