Index: cc/resources/single_release_callback.cc |
diff --git a/cc/resources/single_release_callback.cc b/cc/resources/single_release_callback.cc |
index 4c199dc6a4d585816655abbf1b708a5c9c9e63ec..8f1e83de1167af6e9b27e357c2a861ae7db56585 100644 |
--- a/cc/resources/single_release_callback.cc |
+++ b/cc/resources/single_release_callback.cc |
@@ -15,15 +15,25 @@ SingleReleaseCallback::SingleReleaseCallback(const ReleaseCallback& callback) |
<< "Use a NULL SingleReleaseCallback for an empty callback."; |
} |
+SingleReleaseCallback::SingleReleaseCallback( |
+ std::unique_ptr<PtrHolder> ptr_holder) |
+ : ptr_holder_(std::move(ptr_holder)) {} |
+ |
SingleReleaseCallback::~SingleReleaseCallback() { |
DCHECK(callback_.is_null()) << "SingleReleaseCallback was never run."; |
+ DCHECK(!ptr_holder_) << "SingleReleaseCallback was never run."; |
} |
void SingleReleaseCallback::Run(const gpu::SyncToken& sync_token, |
bool is_lost) { |
- DCHECK(!callback_.is_null()) |
+ DCHECK(callback_ || ptr_holder_) |
<< "SingleReleaseCallback was run more than once."; |
- base::ResetAndReturn(&callback_).Run(sync_token, is_lost); |
+ if (ptr_holder_) |
+ ptr_holder_->Release(sync_token, is_lost); |
+ else |
+ callback_.Run(sync_token, is_lost); |
+ ptr_holder_.reset(); |
+ callback_.Reset(); |
} |
} // namespace cc |