Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index 787757c3b86f62847ec3ae99a27747bd0553b414..6252cfc6e6724d675ceb97479895552370d18a95 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -7,6 +7,7 @@ |
#include <algorithm> |
#include <limits> |
+#include "base/callback_helpers.h" |
#include "base/containers/hash_tables.h" |
#include "base/debug/alias.h" |
#include "base/stl_util.h" |
@@ -306,7 +307,8 @@ ResourceProvider::CreateResourceFromExternalTexture( |
} |
ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
- const TextureMailbox& mailbox) { |
+ const TextureMailbox& mailbox, |
+ ScopedReleaseCallback release_callback) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
// Just store the information. Mailbox will be consumed in LockForRead(). |
ResourceId id = next_id_++; |
@@ -326,6 +328,7 @@ ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
resource.external = true; |
resource.allocated = true; |
resource.mailbox = mailbox; |
+ resource.release_callback = release_callback.Leak(); |
return id; |
} |
@@ -394,7 +397,8 @@ void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it, |
resource->pixels = NULL; |
} |
} |
- resource->mailbox.RunReleaseCallback(sync_point, lost_resource); |
+ base::ResetAndReturn(&resource->release_callback).Run( |
+ sync_point, lost_resource); |
} |
if (resource->pixels) |
delete[] resource->pixels; |
@@ -946,9 +950,8 @@ void ResourceProvider::ReceiveReturnsFromParent( |
if (it->sync_point) |
GLC(context3d, context3d->waitSyncPoint(it->sync_point)); |
} else { |
- resource->mailbox = TextureMailbox(resource->mailbox.name(), |
- resource->mailbox.callback(), |
- it->sync_point); |
+ resource->mailbox = |
+ TextureMailbox(resource->mailbox.name(), it->sync_point); |
} |
if (resource->marked_for_deletion) |
DeleteResourceInternal(map_iterator, Normal); |