1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef PPAPI_PROXY_RESOURCE_REPLY_THREAD_REGISTRAR_H_ 6 #define PPAPI_PROXY_RESOURCE_REPLY_THREAD_REGISTRAR_H_ 7 8 #include <map> 9 #include <set> 10 11 #include "base/basictypes.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/synchronization/lock.h" 14 #include "ppapi/c/pp_resource.h" 15 #include "ppapi/proxy/ppapi_proxy_export.h" 16 17 18 namespace base { 19 class MessageLoopProxy; 20 } 21 22 namespace IPC { 23 class Message; 24 } 25 26 namespace ppapi { 27 28 class TrackedCallback; 29 30 namespace proxy { 31 32 class ResourceMessageReplyParams; 33 34 // ResourceReplyThreadRegistrar records the handling thread for 35 // PpapiPluginMsg_ResourceReply messages. 36 // This class is thread safe. 37 class PPAPI_PROXY_EXPORT ResourceReplyThreadRegistrar 38 : public base::RefCountedThreadSafe<ResourceReplyThreadRegistrar> { 39 public: 40 explicit ResourceReplyThreadRegistrar( 41 scoped_refptr<base::MessageLoopProxy> main_thread); 42 43 // This method can only be called while holding the Pepper proxy lock; the 44 // other methods can be called with/without the Pepper proxy lock. 45 void Register(PP_Resource resource, 46 int32_t sequence_number, 47 scoped_refptr<TrackedCallback> reply_thread_hint); 48 void Unregister(PP_Resource resource); 49 50 // This results in Resource::OnReplyReceived() for the specified message type 51 // to be called on the IO thread directly, while holding the Pepper proxy 52 // lock. 53 void HandleOnIOThread(uint32 nested_msg_type); 54 55 // This method returns NULL if the target thread is the IO thread (because 56 // that is the thread on which this method is supposed to be called). 57 scoped_refptr<base::MessageLoopProxy> GetTargetThread( 58 const ResourceMessageReplyParams& reply_params, 59 const IPC::Message& nested_msg); 60 61 private: 62 friend class base::RefCountedThreadSafe<ResourceReplyThreadRegistrar>; 63 64 typedef std::map<int32_t, scoped_refptr<base::MessageLoopProxy> > 65 SequenceThreadMap; 66 typedef std::map<PP_Resource, SequenceThreadMap> ResourceMap; 67 68 ~ResourceReplyThreadRegistrar(); 69 70 // The lock that protects the data members below. 71 // Please note that we should never try to acquire the Pepper proxy lock while 72 // holding |lock_|, otherwise we will cause deadlock. 73 base::Lock lock_; 74 ResourceMap map_; 75 std::set<uint32> io_thread_message_types_; 76 scoped_refptr<base::MessageLoopProxy> main_thread_; 77 78 DISALLOW_COPY_AND_ASSIGN(ResourceReplyThreadRegistrar); 79 }; 80 81 } // namespace proxy 82 } // namespace ppapi 83 84 #endif // PPAPI_PROXY_RESOURCE_REPLY_THREAD_REGISTRAR_H_ 85