This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[PATCH, libstdc++] Improve slightly __cxa_guard_acquire
- From: Thiago Macieira <thiago dot macieira at intel dot com>
- To: gcc-patches at gcc dot gnu dot org, libstdc++ at gcc dot gnu dot org
- Date: Thu, 30 Aug 2012 12:48:34 +0200
- Subject: [PATCH, libstdc++] Improve slightly __cxa_guard_acquire
Hello
The attached patch is a simple improvement to make a thread that failed to set
the waiting bit to exit the function earlier, if it detects that another
thread has successfully finished initialising. It matches the CAS code from a
few lines above.
The change from RELAXED to ACQUIRE is noted in the previous patch I've just
sent.
--
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
2012-08-30 Thiago Macieira <thiago.macieira@intel.com>
* libsupc++/guard.cc (__cxa_guard_acquire): exit the loop earlier if
we detect that another thread has had success.
---
libstdc++-v3/libsupc++/guard.cc | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc
index bfe1a59..73d7221 100644
--- a/libstdc++-v3/libsupc++/guard.cc
+++ b/libstdc++-v3/libsupc++/guard.cc
@@ -269,8 +269,16 @@ namespace __cxxabiv1
int newv = expected | waiting_bit;
if (!__atomic_compare_exchange_n(gi, &expected, newv, false,
__ATOMIC_ACQ_REL,
- __ATOMIC_RELAXED))
- continue;
+ __ATOMIC_ACQUIRE))
+ {
+ if (expected == guard_bit)
+ {
+ // Already initialized.
+ return 0;
+ }
+ if (expected == 0)
+ continue;
+ }
expected = newv;
}
--
1.7.11.4