Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(899)

Unified Diff: ppapi/host/resource_message_filter.h

Issue 53153002: Pepper: always delete ResourceMessageFilter objects on the creation thread. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ppapi/host/resource_message_filter.h
diff --git a/ppapi/host/resource_message_filter.h b/ppapi/host/resource_message_filter.h
index ef00cf7ae22f7ee33430b9cfa48c46ca7f532591..49d0a6ee64c520515dba4bd2ad1bedb34664f598 100644
--- a/ppapi/host/resource_message_filter.h
+++ b/ppapi/host/resource_message_filter.h
@@ -24,6 +24,15 @@ namespace ppapi {
namespace host {
class ResourceHost;
+class ResourceMessageFilter;
+
+namespace internal {
+
+struct ResourceMessageFilterDeleteTraits {
+ static void Destruct(const ResourceMessageFilter* filter);
+};
+
+} // namespace internal
// This is the base class of resource message filters that can handle resource
// messages on another thread. ResourceHosts can handle most messages
@@ -65,17 +74,27 @@ class ResourceHost;
// AddFilter(make_scoped_refptr(new MyMessageFilter));
class PPAPI_HOST_EXPORT ResourceMessageFilter
: public ResourceMessageHandler,
- public base::RefCountedThreadSafe<ResourceMessageFilter> {
+ public base::RefCountedThreadSafe<
+ ResourceMessageFilter, internal::ResourceMessageFilterDeleteTraits> {
public:
+ enum DeletionThread {
+ // This object could be deleted on any thread.
+ DELETE_ON_ANY_THREAD,
+ // This object should be deleted on the same thread as it was created.
+ DELETE_ON_CREATION_THREAD
+ };
+
// This object must be constructed on the same thread that a reply message
// should be sent, i.e. the IO thread when constructed in the browser process
// or the main thread when constructed in the renderer process. Since
// ResourceMessageFilters are usually constructed in the constructor of the
// owning ResourceHost, this will almost always be the case anyway.
- ResourceMessageFilter();
+ // |deletion_thread| specifies on which thread the object should be deleted.
+ explicit ResourceMessageFilter(DeletionThread deletion_thread);
// Test constructor. Allows you to specify the message loop which will be used
// to dispatch replies on.
ResourceMessageFilter(
+ DeletionThread deletion_thread,
scoped_refptr<base::MessageLoopProxy> reply_thread_message_loop_proxy);
// Called when a filter is added to a ResourceHost.
@@ -93,7 +112,6 @@ class PPAPI_HOST_EXPORT ResourceMessageFilter
const IPC::Message& msg) OVERRIDE;
protected:
- friend class base::RefCountedThreadSafe<ResourceMessageFilter>;
virtual ~ResourceMessageFilter();
// If you want the message to be handled on another thread, return a non-null
@@ -102,10 +120,20 @@ class PPAPI_HOST_EXPORT ResourceMessageFilter
const IPC::Message& message);
private:
+ friend class base::DeleteHelper<ResourceMessageFilter>;
+ friend class base::RefCountedThreadSafe<
+ ResourceMessageFilter, internal::ResourceMessageFilterDeleteTraits>;
+ friend struct internal::ResourceMessageFilterDeleteTraits;
+
// This method is posted to the target thread and runs the message handler.
void DispatchMessage(const IPC::Message& msg,
HostMessageContext context);
+ void InternalDestruct() const;
+
+ // Set to NULL if the object can be deleted on any thread.
+ scoped_refptr<base::MessageLoopProxy> deletion_message_loop_proxy_;
+
// Message loop to send resource message replies on. This will be the message
// loop proxy of the IO thread for the browser process or the main thread for
// the renderer process.

Powered by Google App Engine
This is Rietveld 408576698