Commit 1ad54bb7 authored by skyostil@chromium.org's avatar skyostil@chromium.org

Fix data race with synthetic delay initialization

The synthetic delay macro initializes a local atomic variable to point
to a delay implementation class. Because initializing the class involves
writing data to memory which is subsequently deferences through the
atomic pointer, we need to use memory barries when updating the pointer
to make sure the data behind it is committed.

Thanks to Alexander Potapenko for spotting this.

Review URL: https://codereview.chromium.org/392933002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284203 0039d316-1c4b-4281-b951-d872f2087c98
parent 194cf64f
...@@ -220,11 +220,11 @@ base::debug::TraceEventSyntheticDelay* GetOrCreateDelay( ...@@ -220,11 +220,11 @@ base::debug::TraceEventSyntheticDelay* GetOrCreateDelay(
base::subtle::AtomicWord* impl_ptr) { base::subtle::AtomicWord* impl_ptr) {
base::debug::TraceEventSyntheticDelay* delay_impl = base::debug::TraceEventSyntheticDelay* delay_impl =
reinterpret_cast<base::debug::TraceEventSyntheticDelay*>( reinterpret_cast<base::debug::TraceEventSyntheticDelay*>(
base::subtle::NoBarrier_Load(impl_ptr)); base::subtle::Acquire_Load(impl_ptr));
if (!delay_impl) { if (!delay_impl) {
delay_impl = base::debug::TraceEventSyntheticDelayRegistry::GetInstance() delay_impl = base::debug::TraceEventSyntheticDelayRegistry::GetInstance()
->GetOrCreateDelay(name); ->GetOrCreateDelay(name);
base::subtle::NoBarrier_Store( base::subtle::Release_Store(
impl_ptr, reinterpret_cast<base::subtle::AtomicWord>(delay_impl)); impl_ptr, reinterpret_cast<base::subtle::AtomicWord>(delay_impl));
} }
return delay_impl; return delay_impl;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment