path: root/src/network/kernel/qdnslookup_unix.cpp
diff options
authorMarc Mutz <>2012-08-24 09:47:55 +0200
committerQt by Nokia <>2012-08-29 14:14:46 +0200
commitb2edd830b1493ac7fb03a89ce6975769e2a3cbda (patch)
tree2bc1092562a6f4028c46ed22c810ee2099868a9c /src/network/kernel/qdnslookup_unix.cpp
parent462a266edf88c763db221e547ba96fdfd2a6222b (diff)
QDnsLookupRunnable: replace a volatile bool with an atomic int
Since there is non-atomic data that is protected by 'triedResolve', the (outer) read from triedResolve needs to have acquire, and the store needs to have release semantics. The release implied by the mutex unlock is not good enough because it only synchronises-with the locking of the same mutex, which not all threads execute. Change-Id: If46b3ea6ccfdd66ca41ce44d4f45bef2c2c30f72 Reviewed-by: Thiago Macieira <> Reviewed-by: Shane Kearns <>
Diffstat (limited to 'src/network/kernel/qdnslookup_unix.cpp')
1 files changed, 4 insertions, 4 deletions
diff --git a/src/network/kernel/qdnslookup_unix.cpp b/src/network/kernel/qdnslookup_unix.cpp
index 300f99d232..1b8f66b275 100644
--- a/src/network/kernel/qdnslookup_unix.cpp
+++ b/src/network/kernel/qdnslookup_unix.cpp
@@ -107,12 +107,12 @@ static void resolveLibrary()
void QDnsLookupRunnable::query(const int requestType, const QByteArray &requestName, QDnsLookupReply *reply)
// Load dn_expand, res_ninit and res_nquery on demand.
- static volatile bool triedResolve = false;
- if (!triedResolve) {
+ static QBasicAtomicInt triedResolve = Q_BASIC_ATOMIC_INITIALIZER(false);
+ if (!triedResolve.loadAcquire()) {
QMutexLocker locker(QMutexPool::globalInstanceGet(&local_res_ninit));
- if (!triedResolve) {
+ if (!triedResolve.load()) {
- triedResolve = true;
+ triedResolve.storeRelease(true);