diff options
-rw-r--r-- | ppapi/proxy/file_chooser_resource_unittest.cc | 22 | ||||
-rw-r--r-- | ppapi/proxy/plugin_var_tracker_unittest.cc | 7 | ||||
-rw-r--r-- | ppapi/proxy/ppp_messaging_proxy_unittest.cc | 2 | ||||
-rw-r--r-- | ppapi/shared_impl/ppb_url_util_shared.cc | 4 | ||||
-rw-r--r-- | ppapi/shared_impl/ppb_var_shared.cc | 12 | ||||
-rw-r--r-- | ppapi/shared_impl/private/net_address_private_impl.cc | 4 | ||||
-rw-r--r-- | ppapi/shared_impl/var_tracker.cc | 17 |
7 files changed, 56 insertions, 12 deletions
diff --git a/ppapi/proxy/file_chooser_resource_unittest.cc b/ppapi/proxy/file_chooser_resource_unittest.cc index 10ac0b3..49c95da 100644 --- a/ppapi/proxy/file_chooser_resource_unittest.cc +++ b/ppapi/proxy/file_chooser_resource_unittest.cc @@ -8,10 +8,11 @@ #include "ppapi/proxy/file_chooser_resource.h" #include "ppapi/proxy/ppapi_messages.h" #include "ppapi/proxy/ppapi_proxy_test.h" -#include "ppapi/thunk/thunk.h" +#include "ppapi/shared_impl/proxy_lock.h" #include "ppapi/shared_impl/scoped_pp_resource.h" #include "ppapi/shared_impl/scoped_pp_var.h" #include "ppapi/shared_impl/var.h" +#include "ppapi/thunk/thunk.h" namespace ppapi { namespace proxy { @@ -110,14 +111,19 @@ TEST_F(FileChooserResourceTest, Show) { EXPECT_EQ(PP_FILESYSTEMTYPE_EXTERNAL, file_ref_iface->GetFileSystemType(dest[0])); - ScopedPPVar name_var(ScopedPPVar::PassRef(), - file_ref_iface->GetName(dest[0])); - EXPECT_VAR_IS_STRING(create_info.name, name_var.get()); - + PP_Var name_var(file_ref_iface->GetName(dest[0])); + { + ProxyAutoLock lock; + ScopedPPVar release_name_var(ScopedPPVar::PassRef(), name_var); + EXPECT_VAR_IS_STRING(create_info.name, name_var); + } // Path should be undefined since it's external filesystem. - ScopedPPVar path_var(ScopedPPVar::PassRef(), - file_ref_iface->GetPath(dest[0])); - EXPECT_EQ(PP_VARTYPE_UNDEFINED, path_var.get().type); + PP_Var path_var(file_ref_iface->GetPath(dest[0])); + { + ProxyAutoLock lock; + ScopedPPVar release_path_var(ScopedPPVar::PassRef(), path_var); + EXPECT_EQ(PP_VARTYPE_UNDEFINED, path_var.type); + } } TEST_F(FileChooserResourceTest, PopulateAcceptTypes) { diff --git a/ppapi/proxy/plugin_var_tracker_unittest.cc b/ppapi/proxy/plugin_var_tracker_unittest.cc index 10a7c50..83ce6be 100644 --- a/ppapi/proxy/plugin_var_tracker_unittest.cc +++ b/ppapi/proxy/plugin_var_tracker_unittest.cc @@ -8,6 +8,7 @@ #include "ppapi/proxy/ppapi_messages.h" #include "ppapi/proxy/ppapi_proxy_test.h" #include "ppapi/proxy/proxy_object_var.h" +#include "ppapi/shared_impl/proxy_lock.h" namespace ppapi { namespace proxy { @@ -62,6 +63,7 @@ class PluginVarTrackerTest : public PluginProxyTest { }; TEST_F(PluginVarTrackerTest, GetHostObject) { + ProxyAutoLock lock; PP_Var host_object = MakeObject(12345); // Round-trip through the tracker to make sure the host object comes out the @@ -76,6 +78,7 @@ TEST_F(PluginVarTrackerTest, GetHostObject) { } TEST_F(PluginVarTrackerTest, ReceiveObjectPassRef) { + ProxyAutoLock lock; PP_Var host_object = MakeObject(12345); // Receive the object, we should have one ref and no messages. @@ -111,6 +114,7 @@ TEST_F(PluginVarTrackerTest, ReceiveObjectPassRef) { // Tests freeing objects that have both refcounts and "tracked with no ref". TEST_F(PluginVarTrackerTest, FreeTrackedAndReferencedObject) { + ProxyAutoLock lock; PP_Var host_object = MakeObject(12345); // Phase one: First receive via a "pass ref", then a tracked with no ref. @@ -158,6 +162,7 @@ TEST_F(PluginVarTrackerTest, FreeTrackedAndReferencedObject) { } TEST_F(PluginVarTrackerTest, RecursiveTrackWithNoRef) { + ProxyAutoLock lock; PP_Var host_object = MakeObject(12345); // Receive a tracked object twice. @@ -184,6 +189,7 @@ TEST_F(PluginVarTrackerTest, RecursiveTrackWithNoRef) { // Tests that objects implemented by the plugin that have no references by // the plugin get their Deallocate function called on destruction. TEST_F(PluginVarTrackerTest, PluginObjectInstanceDeleted) { + ProxyAutoLock lock; PP_Var host_object = MakeObject(12345); PP_Instance pp_instance = 0x12345; @@ -214,6 +220,7 @@ TEST_F(PluginVarTrackerTest, PluginObjectInstanceDeleted) { // object var longer than the instance. We should not call the destructor until // the plugin releases its last ref. TEST_F(PluginVarTrackerTest, PluginObjectLeaked) { + ProxyAutoLock lock; PP_Var host_object = MakeObject(12345); PP_Instance pp_instance = 0x12345; diff --git a/ppapi/proxy/ppp_messaging_proxy_unittest.cc b/ppapi/proxy/ppp_messaging_proxy_unittest.cc index 98cfadd..1fe0ef7 100644 --- a/ppapi/proxy/ppp_messaging_proxy_unittest.cc +++ b/ppapi/proxy/ppp_messaging_proxy_unittest.cc @@ -9,6 +9,7 @@ #include "ppapi/c/ppb_var.h" #include "ppapi/c/ppp_messaging.h" #include "ppapi/proxy/ppapi_proxy_test.h" +#include "ppapi/shared_impl/proxy_lock.h" #include "ppapi/shared_impl/var.h" namespace ppapi { @@ -53,6 +54,7 @@ class PPP_Messaging_ProxyTest : public TwoWayTest { void CompareAndReleaseStringVar(PluginProxyTestHarness* plugin_harness, PP_Var received_var, const std::string& test_string) { + ProxyAutoLock lock; Var* received_string = plugin_harness->var_tracker().GetVar(received_var); ASSERT_TRUE(received_string); ASSERT_TRUE(received_string->AsStringVar()); diff --git a/ppapi/shared_impl/ppb_url_util_shared.cc b/ppapi/shared_impl/ppb_url_util_shared.cc index f473530..7788f4a 100644 --- a/ppapi/shared_impl/ppb_url_util_shared.cc +++ b/ppapi/shared_impl/ppb_url_util_shared.cc @@ -6,6 +6,7 @@ #include "googleurl/src/gurl.h" #include "ppapi/shared_impl/ppapi_globals.h" +#include "ppapi/shared_impl/proxy_lock.h" #include "ppapi/shared_impl/var.h" #include "ppapi/shared_impl/var_tracker.h" @@ -45,6 +46,7 @@ void ConvertComponents(const url_parse::Parsed& input, // static PP_Var PPB_URLUtil_Shared::Canonicalize(PP_Var url, PP_URLComponents_Dev* components) { + ProxyAutoLock lock; StringVar* url_string = StringVar::FromPPVar(url); if (!url_string) return PP_MakeNull(); @@ -56,6 +58,7 @@ PP_Var PPB_URLUtil_Shared::ResolveRelativeToURL( PP_Var base_url, PP_Var relative, PP_URLComponents_Dev* components) { + ProxyAutoLock lock; StringVar* base_url_string = StringVar::FromPPVar(base_url); StringVar* relative_string = StringVar::FromPPVar(relative); if (!base_url_string || !relative_string) @@ -70,6 +73,7 @@ PP_Var PPB_URLUtil_Shared::ResolveRelativeToURL( // static PP_Bool PPB_URLUtil_Shared::IsSameSecurityOrigin(PP_Var url_a, PP_Var url_b) { + ProxyAutoLock lock; StringVar* url_a_string = StringVar::FromPPVar(url_a); StringVar* url_b_string = StringVar::FromPPVar(url_b); if (!url_a_string || !url_b_string) diff --git a/ppapi/shared_impl/ppb_var_shared.cc b/ppapi/shared_impl/ppb_var_shared.cc index 107058a..702a89a 100644 --- a/ppapi/shared_impl/ppb_var_shared.cc +++ b/ppapi/shared_impl/ppb_var_shared.cc @@ -24,17 +24,17 @@ namespace { // PPB_Var methods ------------------------------------------------------------- void AddRefVar(PP_Var var) { - ppapi::ProxyAutoLock lock; + ProxyAutoLock lock; PpapiGlobals::Get()->GetVarTracker()->AddRefVar(var); } void ReleaseVar(PP_Var var) { - ppapi::ProxyAutoLock lock; + ProxyAutoLock lock; PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(var); } PP_Var VarFromUtf8(const char* data, uint32_t len) { - ppapi::ProxyAutoLock lock; + ProxyAutoLock lock; return StringVar::StringToPPVar(data, len); } @@ -43,7 +43,7 @@ PP_Var VarFromUtf8_1_0(PP_Module /*module*/, const char* data, uint32_t len) { } const char* VarToUtf8(PP_Var var, uint32_t* len) { - ppapi::ProxyAutoLock lock; + ProxyAutoLock lock; StringVar* str = StringVar::FromPPVar(var); if (str) { *len = static_cast<uint32_t>(str->value().size()); @@ -71,11 +71,13 @@ const PPB_Var_1_0 var_interface1_0 = { // PPB_VarArrayBuffer methods -------------------------------------------------- PP_Var CreateArrayBufferVar(uint32_t size_in_bytes) { + ProxyAutoLock lock; return PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar( size_in_bytes); } PP_Bool ByteLength(PP_Var array, uint32_t* byte_length) { + ProxyAutoLock lock; ArrayBufferVar* buffer = ArrayBufferVar::FromPPVar(array); if (!buffer) return PP_FALSE; @@ -84,6 +86,7 @@ PP_Bool ByteLength(PP_Var array, uint32_t* byte_length) { } void* Map(PP_Var array) { + ProxyAutoLock lock; ArrayBufferVar* buffer = ArrayBufferVar::FromPPVar(array); if (!buffer) return NULL; @@ -91,6 +94,7 @@ void* Map(PP_Var array) { } void Unmap(PP_Var array) { + ProxyAutoLock lock; ArrayBufferVar* buffer = ArrayBufferVar::FromPPVar(array); if (buffer) buffer->Unmap(); diff --git a/ppapi/shared_impl/private/net_address_private_impl.cc b/ppapi/shared_impl/private/net_address_private_impl.cc index 7a8e375..87a929f 100644 --- a/ppapi/shared_impl/private/net_address_private_impl.cc +++ b/ppapi/shared_impl/private/net_address_private_impl.cc @@ -24,6 +24,7 @@ #include "build/build_config.h" #include "ppapi/c/pp_var.h" #include "ppapi/c/private/ppb_net_address_private.h" +#include "ppapi/shared_impl/proxy_lock.h" #include "ppapi/shared_impl/var.h" #include "ppapi/thunk/thunk.h" @@ -285,6 +286,9 @@ PP_Var Describe(PP_Module /*module*/, *addr, PP_ToBool(include_port)); if (str.empty()) return PP_MakeUndefined(); + // We must acquire the lock while accessing the VarTracker, which is part of + // the critical section of the proxy which may be accessed by other threads. + ProxyAutoLock lock; return StringVar::StringToPPVar(str); } diff --git a/ppapi/shared_impl/var_tracker.cc b/ppapi/shared_impl/var_tracker.cc index d515cf7..6bc0261 100644 --- a/ppapi/shared_impl/var_tracker.cc +++ b/ppapi/shared_impl/var_tracker.cc @@ -10,6 +10,7 @@ #include "base/logging.h" #include "ppapi/shared_impl/id_assignment.h" +#include "ppapi/shared_impl/proxy_lock.h" #include "ppapi/shared_impl/var.h" namespace ppapi { @@ -34,12 +35,14 @@ VarTracker::~VarTracker() { int32 VarTracker::AddVar(Var* var) { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); return AddVarInternal(var, ADD_VAR_TAKE_ONE_REFERENCE); } Var* VarTracker::GetVar(int32 var_id) const { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); VarMap::const_iterator result = live_vars_.find(var_id); if (result == live_vars_.end()) @@ -49,6 +52,7 @@ Var* VarTracker::GetVar(int32 var_id) const { Var* VarTracker::GetVar(const PP_Var& var) const { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); if (!IsVarTypeRefcounted(var.type)) return NULL; @@ -57,6 +61,7 @@ Var* VarTracker::GetVar(const PP_Var& var) const { bool VarTracker::AddRefVar(int32 var_id) { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); DLOG_IF(ERROR, !CheckIdType(var_id, PP_ID_TYPE_VAR)) << var_id << " is not a PP_Var ID."; @@ -82,6 +87,7 @@ bool VarTracker::AddRefVar(int32 var_id) { bool VarTracker::AddRefVar(const PP_Var& var) { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); if (!IsVarTypeRefcounted(var.type)) return false; @@ -90,6 +96,7 @@ bool VarTracker::AddRefVar(const PP_Var& var) { bool VarTracker::ReleaseVar(int32 var_id) { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); DLOG_IF(ERROR, !CheckIdType(var_id, PP_ID_TYPE_VAR)) << var_id << " is not a PP_Var ID."; @@ -121,6 +128,7 @@ bool VarTracker::ReleaseVar(int32 var_id) { bool VarTracker::ReleaseVar(const PP_Var& var) { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); if (!IsVarTypeRefcounted(var.type)) return false; @@ -145,6 +153,7 @@ VarTracker::VarMap::iterator VarTracker::GetLiveVar(int32 id) { int VarTracker::GetRefCountForObject(const PP_Var& plugin_object) { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); VarMap::iterator found = GetLiveVar(plugin_object); if (found == live_vars_.end()) @@ -155,6 +164,7 @@ int VarTracker::GetRefCountForObject(const PP_Var& plugin_object) { int VarTracker::GetTrackedWithNoReferenceCountForObject( const PP_Var& plugin_object) { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); VarMap::iterator found = GetLiveVar(plugin_object); if (found == live_vars_.end()) @@ -177,6 +187,7 @@ bool VarTracker::IsVarTypeRefcounted(PP_VarType type) const { PP_Var VarTracker::MakeArrayBufferPPVar(uint32 size_in_bytes) { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); scoped_refptr<ArrayBufferVar> array_buffer(CreateArrayBuffer(size_in_bytes)); if (!array_buffer) @@ -186,6 +197,9 @@ PP_Var VarTracker::MakeArrayBufferPPVar(uint32 size_in_bytes) { PP_Var VarTracker::MakeArrayBufferPPVar(uint32 size_in_bytes, const void* data) { + DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); + ArrayBufferVar* array_buffer = MakeArrayBufferVar(size_in_bytes, data); return array_buffer ? array_buffer->GetPPVar() : PP_MakeNull(); } @@ -193,6 +207,8 @@ PP_Var VarTracker::MakeArrayBufferPPVar(uint32 size_in_bytes, ArrayBufferVar* VarTracker::MakeArrayBufferVar(uint32 size_in_bytes, const void* data) { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); + ArrayBufferVar* array_buffer(CreateArrayBuffer(size_in_bytes)); if (!array_buffer) return NULL; @@ -202,6 +218,7 @@ ArrayBufferVar* VarTracker::MakeArrayBufferVar(uint32 size_in_bytes, std::vector<PP_Var> VarTracker::GetLiveVars() { DCHECK(CalledOnValidThread()); + ProxyLock::AssertAcquired(); std::vector<PP_Var> var_vector; var_vector.reserve(live_vars_.size()); |