summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtchang%redhat.com <devnull@localhost>2005-03-16 19:24:45 +0000
committerwtchang%redhat.com <devnull@localhost>2005-03-16 19:24:45 +0000
commite678e9da8e60c3b4076ae6f615c67ef781878f29 (patch)
tree3a3cb4f02b4d9b3a278e9aa35cf1f128133db648
parent1dd8f4fa01825ee7104b0362ea48b0fd7ec20fd6 (diff)
downloadnss-hg-e678e9da8e60c3b4076ae6f615c67ef781878f29.tar.gz
Bugzilla Bug 286318: performance optimization: save the result of
PK11_SESSION_LOCK in a local variable and reuse the result. r=nelsonb. Modified Files: pkcs11.c pkcs11u.c
-rw-r--r--security/nss/lib/softoken/pkcs11.c19
-rw-r--r--security/nss/lib/softoken/pkcs11u.c15
2 files changed, 21 insertions, 13 deletions
diff --git a/security/nss/lib/softoken/pkcs11.c b/security/nss/lib/softoken/pkcs11.c
index 341d5c1fc..925022362 100644
--- a/security/nss/lib/softoken/pkcs11.c
+++ b/security/nss/lib/softoken/pkcs11.c
@@ -3403,11 +3403,13 @@ CK_RV NSC_OpenSession(CK_SLOT_ID slotID, CK_FLAGS flags,
}
do {
+ PK11_USE_THREADS(PZLock *lock;)
do {
sessionID = (PR_AtomicIncrement(&slot->sessionIDCount) & 0xffffff)
| (slot->index << 24);
} while (sessionID == CK_INVALID_HANDLE);
- PK11_USE_THREADS(PZ_Lock(PK11_SESSION_LOCK(slot,sessionID));)
+ PK11_USE_THREADS(lock = PK11_SESSION_LOCK(slot,sessionID);)
+ PK11_USE_THREADS(PZ_Lock(lock);)
pk11queue_find(sameID, sessionID, slot->head, slot->sessHashSize);
if (sameID == NULL) {
session->handle = sessionID;
@@ -3416,7 +3418,7 @@ CK_RV NSC_OpenSession(CK_SLOT_ID slotID, CK_FLAGS flags,
} else {
slot->sessionIDConflict++; /* for debugging */
}
- PK11_USE_THREADS(PZ_Unlock(PK11_SESSION_LOCK(slot,sessionID));)
+ PK11_USE_THREADS(PZ_Unlock(lock);)
} while (sameID != NULL);
*phSession = sessionID;
@@ -3431,6 +3433,7 @@ CK_RV NSC_CloseSession(CK_SESSION_HANDLE hSession)
PK11Session *session;
SECItem *pw = NULL;
PRBool sessionFound;
+ PK11_USE_THREADS(PZLock *lock;)
session = pk11_SessionFromHandle(hSession);
if (session == NULL) return CKR_SESSION_HANDLE_INVALID;
@@ -3438,14 +3441,15 @@ CK_RV NSC_CloseSession(CK_SESSION_HANDLE hSession)
sessionFound = PR_FALSE;
/* lock */
- PK11_USE_THREADS(PZ_Lock(PK11_SESSION_LOCK(slot,hSession));)
+ PK11_USE_THREADS(lock = PK11_SESSION_LOCK(slot,hSession);)
+ PK11_USE_THREADS(PZ_Lock(lock);)
if (pk11queue_is_queued(session,hSession,slot->head,slot->sessHashSize)) {
sessionFound = PR_TRUE;
pk11queue_delete(session,hSession,slot->head,slot->sessHashSize);
session->refCount--; /* can't go to zero while we hold the reference */
PORT_Assert(session->refCount > 0);
}
- PK11_USE_THREADS(PZ_Unlock(PK11_SESSION_LOCK(slot,hSession));)
+ PK11_USE_THREADS(PZ_Unlock(lock);)
if (sessionFound) {
PK11_USE_THREADS(PZ_Lock(slot->slotLock);)
@@ -3491,8 +3495,9 @@ CK_RV NSC_CloseAllSessions (CK_SLOT_ID slotID)
* NSC_CloseAllSessions... but any session running when this code starts
* will guarrenteed be close, and no session will be partially closed */
for (i=0; i < slot->sessHashSize; i++) {
+ PK11_USE_THREADS(PZLock *lock = PK11_SESSION_LOCK(slot,i);)
do {
- PK11_USE_THREADS(PZ_Lock(PK11_SESSION_LOCK(slot,i));)
+ PK11_USE_THREADS(PZ_Lock(lock);)
session = slot->head[i];
/* hand deque */
/* this duplicates function of NSC_close session functions, but
@@ -3502,7 +3507,7 @@ CK_RV NSC_CloseAllSessions (CK_SLOT_ID slotID)
slot->head[i] = session->next;
if (session->next) session->next->prev = NULL;
session->next = session->prev = NULL;
- PK11_USE_THREADS(PZ_Unlock(PK11_SESSION_LOCK(slot,i));)
+ PK11_USE_THREADS(PZ_Unlock(lock);)
PK11_USE_THREADS(PZ_Lock(slot->slotLock);)
--slot->sessionCount;
PK11_USE_THREADS(PZ_Unlock(slot->slotLock);)
@@ -3510,7 +3515,7 @@ CK_RV NSC_CloseAllSessions (CK_SLOT_ID slotID)
PR_AtomicDecrement(&slot->rwSessionCount);
}
} else {
- PK11_USE_THREADS(PZ_Unlock(PK11_SESSION_LOCK(slot,i));)
+ PK11_USE_THREADS(PZ_Unlock(lock);)
}
if (session) pk11_FreeSession(session);
} while (session != NULL);
diff --git a/security/nss/lib/softoken/pkcs11u.c b/security/nss/lib/softoken/pkcs11u.c
index 17fc3fdd8..d5b5ffaf9 100644
--- a/security/nss/lib/softoken/pkcs11u.c
+++ b/security/nss/lib/softoken/pkcs11u.c
@@ -2578,11 +2578,12 @@ pk11_update_all_states(PK11Slot *slot)
PK11Session *session;
for (i=0; i < slot->sessHashSize; i++) {
- PK11_USE_THREADS(PZ_Lock(PK11_SESSION_LOCK(slot,i));)
+ PK11_USE_THREADS(PZLock *lock = PK11_SESSION_LOCK(slot,i);)
+ PK11_USE_THREADS(PZ_Lock(lock);)
for (session = slot->head[i]; session; session = session->next) {
pk11_update_state(slot,session);
}
- PK11_USE_THREADS(PZ_Unlock(PK11_SESSION_LOCK(slot,i));)
+ PK11_USE_THREADS(PZ_Unlock(lock);)
}
}
@@ -2692,11 +2693,12 @@ pk11_SessionFromHandle(CK_SESSION_HANDLE handle)
{
PK11Slot *slot = pk11_SlotFromSessionHandle(handle);
PK11Session *session;
+ PK11_USE_THREADS(PZLock *lock = PK11_SESSION_LOCK(slot,handle);)
- PK11_USE_THREADS(PZ_Lock(PK11_SESSION_LOCK(slot,handle));)
+ PK11_USE_THREADS(PZ_Lock(lock);)
pk11queue_find(session,handle,slot->head,slot->sessHashSize);
if (session) session->refCount++;
- PK11_USE_THREADS(PZ_Unlock(PK11_SESSION_LOCK(slot,handle));)
+ PK11_USE_THREADS(PZ_Unlock(lock);)
return (session);
}
@@ -2709,11 +2711,12 @@ pk11_FreeSession(PK11Session *session)
{
PRBool destroy = PR_FALSE;
PK11_USE_THREADS(PK11Slot *slot = pk11_SlotFromSession(session);)
+ PK11_USE_THREADS(PZLock *lock = PK11_SESSION_LOCK(slot,session->handle);)
- PK11_USE_THREADS(PZ_Lock(PK11_SESSION_LOCK(slot,session->handle));)
+ PK11_USE_THREADS(PZ_Lock(lock);)
if (session->refCount == 1) destroy = PR_TRUE;
session->refCount--;
- PK11_USE_THREADS(PZ_Unlock(PK11_SESSION_LOCK(slot,session->handle));)
+ PK11_USE_THREADS(PZ_Unlock(lock);)
if (destroy) pk11_DestroySession(session);
}