diff options
author | wchang0222%aol.com <devnull@localhost> | 2004-03-27 01:25:43 +0000 |
---|---|---|
committer | wchang0222%aol.com <devnull@localhost> | 2004-03-27 01:25:43 +0000 |
commit | 842a4b6e3ad88c3a10bcd10ac82cf008ad4d309f (patch) | |
tree | 4a0bb5b2acbb5445cc61f031c4ee44c0060d9396 | |
parent | e7cb09e7f53aab6e9a5b0967c2ec1f12fd485313 (diff) | |
download | nss-hg-842a4b6e3ad88c3a10bcd10ac82cf008ad4d309f.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.c | 8 | ||||
-rw-r--r-- | security/nss/lib/util/nssrwlk.c | 4 |
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; } |