Index: ppapi/host/resource_message_filter.cc |
diff --git a/ppapi/host/resource_message_filter.cc b/ppapi/host/resource_message_filter.cc |
index ff56cac8c46279759d9b207bb1205a502faf2034..15dc757446e8910229e0d4241f832b161a5d2f6c 100644 |
--- a/ppapi/host/resource_message_filter.cc |
+++ b/ppapi/host/resource_message_filter.cc |
@@ -16,14 +16,29 @@ |
namespace ppapi { |
namespace host { |
+namespace internal { |
+ |
+// static |
+void ResourceMessageFilterDeleteTraits::Destruct( |
+ const ResourceMessageFilter* filter) { |
+ filter->InternalDestruct(); |
+} |
+ |
+} // namespace internal |
+ |
ResourceMessageFilter::ResourceMessageFilter() |
- : reply_thread_message_loop_proxy_( |
+ : deletion_message_loop_proxy_( |
+ base::MessageLoop::current()->message_loop_proxy()), |
+ reply_thread_message_loop_proxy_( |
base::MessageLoop::current()->message_loop_proxy()), |
- resource_host_(NULL) {} |
+ resource_host_(NULL) { |
+} |
ResourceMessageFilter::ResourceMessageFilter( |
scoped_refptr<base::MessageLoopProxy> reply_thread_message_loop_proxy) |
- : reply_thread_message_loop_proxy_(reply_thread_message_loop_proxy), |
+ : deletion_message_loop_proxy_( |
+ base::MessageLoop::current()->message_loop_proxy()), |
+ reply_thread_message_loop_proxy_(reply_thread_message_loop_proxy), |
resource_host_(NULL) { |
} |
@@ -79,5 +94,15 @@ void ResourceMessageFilter::DispatchMessage(const IPC::Message& msg, |
RunMessageHandlerAndReply(msg, &context); |
} |
+void ResourceMessageFilter::InternalDestruct() const { |
+ if (!deletion_message_loop_proxy_->BelongsToCurrentThread()) { |
+ // During shutdown the object may not be deleted, but it should be okay to |
+ // leak in that case. |
+ deletion_message_loop_proxy_->DeleteSoon(FROM_HERE, this); |
+ } else { |
+ delete this; |
+ } |
+} |
+ |
} // namespace host |
} // namespace ppapi |