[PATCH, libstdc++] Fix PR54172
Thiago Macieira
thiago.macieira@intel.com
Thu Aug 30 10:30:00 GMT 2012
Hello
The attached patch fixes a race condition in __cxa_guard_acquire, a regression
from 4.6. When the code was refactored to use the new atomic intrinsics, the
fact that __atomic_compare_exchange_n updates the "expected" variable with the
current value was missed.
That causes the loop to possibly overwrite a successful initialisation and re-
start the initialisation phase. The bug report has a gdb trace with a
watchpoint showing the guard variable transitioning
0 (uninit) -> 256 (pending) -> 1 (done) -> 256 (pending) -> 1 (done)
This situation can happen if both CAS fail in given thread: the first because
the other thread started the initialisation and the second because the
initialisation succeeded.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
Intel Sweden AB - Registration Number: 556189-6027
Knarrarnäsgatan 15, 164 40 Kista, Stockholm, Sweden
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PR-54172-dont-compare_exchange-from-finished-state.patch
Type: text/x-patch
Size: 958 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20120830/7073c09b/attachment.bin>
More information about the Libstdc++
mailing list