summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwchang0222%aol.com <devnull@localhost>2004-03-27 01:25:43 +0000
committerwchang0222%aol.com <devnull@localhost>2004-03-27 01:25:43 +0000
commit842a4b6e3ad88c3a10bcd10ac82cf008ad4d309f (patch)
tree4a0bb5b2acbb5445cc61f031c4ee44c0060d9396
parente7cb09e7f53aab6e9a5b0967c2ec1f12fd485313 (diff)
downloadnss-hg-NSS_CLIENT_TAG_20040409.tar.gz
Bugzilla bug 237934: in nss_InitLock, nss_InitMonitor, andNSS_CLIENT_TAG_20040409NSS_3_9_1_BETA1
NSSRWLock_AtomicCreate, we need to doublecheck the lock/monitor's pointer after we acquired the spin lock. r=nelsonb,jpierre. a=chofmann for mozilla 1.7 final. Modified Files: nsslocks.c nssrwlk.c Tag: NSS_3_9_BRANCH
-rw-r--r--security/nss/lib/util/nsslocks.c8
-rw-r--r--security/nss/lib/util/nssrwlk.c4
2 files changed, 9 insertions, 3 deletions
diff --git a/security/nss/lib/util/nsslocks.c b/security/nss/lib/util/nsslocks.c
index ce9072c68..8b158e025 100644
--- a/security/nss/lib/util/nsslocks.c
+++ b/security/nss/lib/util/nsslocks.c
@@ -60,7 +60,9 @@ __nss_InitLock( PZLock **ppLock, nssILockType ltype )
while (!*ppLock) {
PRInt32 myAttempt = PR_AtomicIncrement(&initializers);
if (myAttempt == 1) {
- *ppLock = PZ_NewLock(ltype);
+ if (!*ppLock) {
+ *ppLock = PZ_NewLock(ltype);
+ }
(void) PR_AtomicDecrement(&initializers);
break;
}
@@ -93,7 +95,9 @@ nss_InitMonitor(PZMonitor **ppMonitor, nssILockType ltype )
while (!*ppMonitor) {
PRInt32 myAttempt = PR_AtomicIncrement(&initializers);
if (myAttempt == 1) {
- *ppMonitor = PZ_NewMonitor(ltype);
+ if (!*ppMonitor) {
+ *ppMonitor = PZ_NewMonitor(ltype);
+ }
(void) PR_AtomicDecrement(&initializers);
break;
}
diff --git a/security/nss/lib/util/nssrwlk.c b/security/nss/lib/util/nssrwlk.c
index 33aaaa713..421d43d87 100644
--- a/security/nss/lib/util/nssrwlk.c
+++ b/security/nss/lib/util/nssrwlk.c
@@ -185,7 +185,9 @@ nssRWLock_AtomicCreate( NSSRWLock ** prwlock,
while (NULL == (rwlock = *prwlock)) {
PRInt32 myAttempt = PR_AtomicIncrement(&initializers);
if (myAttempt == 1) {
- *prwlock = rwlock = NSSRWLock_New(lock_rank, lock_name);
+ if (NULL == (rwlock = *prwlock)) {
+ *prwlock = rwlock = NSSRWLock_New(lock_rank, lock_name);
+ }
(void) PR_AtomicDecrement(&initializers);
break;
}