| 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_;
|
|
|