Index: base/win/scoped_handle.h |
=================================================================== |
--- base/win/scoped_handle.h (revision 237598) |
+++ base/win/scoped_handle.h (working copy) |
@@ -39,6 +39,22 @@ |
public: |
typedef typename Traits::Handle Handle; |
+ // Helper object to contain the effect of Receive() to the function that needs |
+ // a pointer, and allow proper tracking of the handle. |
+ class Receiver { |
+ public: |
+ explicit Receiver(GenericScopedHandle* owner) |
+ : handle_(Traits::NullHandle()), |
+ owner_(owner) {} |
+ ~Receiver() { owner_->Set(handle_); } |
+ |
+ operator Handle*() { return &handle_; } |
+ |
+ private: |
+ Handle handle_; |
+ GenericScopedHandle* owner_; |
+ }; |
+ |
GenericScopedHandle() : handle_(Traits::NullHandle()) {} |
explicit GenericScopedHandle(Handle handle) : handle_(Traits::NullHandle()) { |
@@ -86,6 +102,16 @@ |
return handle_; |
} |
+ // This method is intended to be used with functions that require a pointer to |
+ // a destination handle, like so: |
+ // void CreateRequiredHandle(Handle* out_handle); |
+ // ScopedHandle a; |
+ // CreateRequiredHandle(a.Receive()); |
+ Receiver Receive() { |
+ DCHECK(!Traits::IsHandleValid(handle_)) << "Handle must be NULL"; |
+ return Receiver(this); |
+ } |
+ |
// Transfers ownership away from this object. |
Handle Take() { |
Handle temp = handle_; |