| 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.
|
|
|