summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ppapi/proxy/file_chooser_resource_unittest.cc22
-rw-r--r--ppapi/proxy/plugin_var_tracker_unittest.cc7
-rw-r--r--ppapi/proxy/ppp_messaging_proxy_unittest.cc2
-rw-r--r--ppapi/shared_impl/ppb_url_util_shared.cc4
-rw-r--r--ppapi/shared_impl/ppb_var_shared.cc12
-rw-r--r--ppapi/shared_impl/private/net_address_private_impl.cc4
-rw-r--r--ppapi/shared_impl/var_tracker.cc17
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());