Index: base/win/scoped_handle.h |
diff --git a/base/win/scoped_handle.h b/base/win/scoped_handle.h |
index 0d038e010bdef853adc397441f55f6197d996107..d3f5c22facd64296b0a7cba6af6e2fce62bbbac8 100644 |
--- a/base/win/scoped_handle.h |
+++ b/base/win/scoped_handle.h |
@@ -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()) { |
@@ -84,6 +100,16 @@ |
operator Handle() const { |
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. |