| OLD | NEW |
| (Empty) |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
| 4 | |
| 5 /* | |
| 6 * mutex.c | |
| 7 * | |
| 8 * This file implements a mutual-exclusion locking facility for Modules | |
| 9 * using the NSS Cryptoki Framework. | |
| 10 */ | |
| 11 | |
| 12 #ifndef CK_T | |
| 13 #include "ck.h" | |
| 14 #endif /* CK_T */ | |
| 15 | |
| 16 /* | |
| 17 * NSSCKFWMutex | |
| 18 * | |
| 19 * NSSCKFWMutex_Destroy | |
| 20 * NSSCKFWMutex_Lock | |
| 21 * NSSCKFWMutex_Unlock | |
| 22 * | |
| 23 * nssCKFWMutex_Create | |
| 24 * nssCKFWMutex_Destroy | |
| 25 * nssCKFWMutex_Lock | |
| 26 * nssCKFWMutex_Unlock | |
| 27 * | |
| 28 * -- debugging versions only -- | |
| 29 * nssCKFWMutex_verifyPointer | |
| 30 * | |
| 31 */ | |
| 32 | |
| 33 struct NSSCKFWMutexStr { | |
| 34 PRLock *lock; | |
| 35 }; | |
| 36 | |
| 37 #ifdef DEBUG | |
| 38 /* | |
| 39 * But first, the pointer-tracking stuff. | |
| 40 * | |
| 41 * NOTE: the pointer-tracking support in NSS/base currently relies | |
| 42 * upon NSPR's CallOnce support. That, however, relies upon NSPR's | |
| 43 * locking, which is tied into the runtime. We need a pointer-tracker | |
| 44 * implementation that uses the locks supplied through C_Initialize. | |
| 45 * That support, however, can be filled in later. So for now, I'll | |
| 46 * just do this routines as no-ops. | |
| 47 */ | |
| 48 | |
| 49 static CK_RV | |
| 50 mutex_add_pointer( | |
| 51 const NSSCKFWMutex *fwMutex) | |
| 52 { | |
| 53 return CKR_OK; | |
| 54 } | |
| 55 | |
| 56 static CK_RV | |
| 57 mutex_remove_pointer( | |
| 58 const NSSCKFWMutex *fwMutex) | |
| 59 { | |
| 60 return CKR_OK; | |
| 61 } | |
| 62 | |
| 63 NSS_IMPLEMENT CK_RV | |
| 64 nssCKFWMutex_verifyPointer( | |
| 65 const NSSCKFWMutex *fwMutex) | |
| 66 { | |
| 67 return CKR_OK; | |
| 68 } | |
| 69 | |
| 70 #endif /* DEBUG */ | |
| 71 | |
| 72 /* | |
| 73 * nssCKFWMutex_Create | |
| 74 * | |
| 75 */ | |
| 76 NSS_EXTERN NSSCKFWMutex * | |
| 77 nssCKFWMutex_Create( | |
| 78 CK_C_INITIALIZE_ARGS_PTR pInitArgs, | |
| 79 CryptokiLockingState LockingState, | |
| 80 NSSArena *arena, | |
| 81 CK_RV *pError) | |
| 82 { | |
| 83 NSSCKFWMutex *mutex; | |
| 84 | |
| 85 mutex = nss_ZNEW(arena, NSSCKFWMutex); | |
| 86 if (!mutex) { | |
| 87 *pError = CKR_HOST_MEMORY; | |
| 88 return (NSSCKFWMutex *)NULL; | |
| 89 } | |
| 90 *pError = CKR_OK; | |
| 91 mutex->lock = NULL; | |
| 92 if (LockingState == MultiThreaded) { | |
| 93 mutex->lock = PR_NewLock(); | |
| 94 if (!mutex->lock) { | |
| 95 *pError = CKR_HOST_MEMORY; /* we couldn't get the resource */ | |
| 96 } | |
| 97 } | |
| 98 | |
| 99 if (CKR_OK != *pError) { | |
| 100 (void)nss_ZFreeIf(mutex); | |
| 101 return (NSSCKFWMutex *)NULL; | |
| 102 } | |
| 103 | |
| 104 #ifdef DEBUG | |
| 105 *pError = mutex_add_pointer(mutex); | |
| 106 if (CKR_OK != *pError) { | |
| 107 if (mutex->lock) { | |
| 108 PR_DestroyLock(mutex->lock); | |
| 109 } | |
| 110 (void)nss_ZFreeIf(mutex); | |
| 111 return (NSSCKFWMutex *)NULL; | |
| 112 } | |
| 113 #endif /* DEBUG */ | |
| 114 | |
| 115 return mutex; | |
| 116 } | |
| 117 | |
| 118 /* | |
| 119 * nssCKFWMutex_Destroy | |
| 120 * | |
| 121 */ | |
| 122 NSS_EXTERN CK_RV | |
| 123 nssCKFWMutex_Destroy( | |
| 124 NSSCKFWMutex *mutex) | |
| 125 { | |
| 126 CK_RV rv = CKR_OK; | |
| 127 | |
| 128 #ifdef NSSDEBUG | |
| 129 rv = nssCKFWMutex_verifyPointer(mutex); | |
| 130 if (CKR_OK != rv) { | |
| 131 return rv; | |
| 132 } | |
| 133 #endif /* NSSDEBUG */ | |
| 134 | |
| 135 if (mutex->lock) { | |
| 136 PR_DestroyLock(mutex->lock); | |
| 137 } | |
| 138 | |
| 139 #ifdef DEBUG | |
| 140 (void)mutex_remove_pointer(mutex); | |
| 141 #endif /* DEBUG */ | |
| 142 | |
| 143 (void)nss_ZFreeIf(mutex); | |
| 144 return rv; | |
| 145 } | |
| 146 | |
| 147 /* | |
| 148 * nssCKFWMutex_Lock | |
| 149 * | |
| 150 */ | |
| 151 NSS_EXTERN CK_RV | |
| 152 nssCKFWMutex_Lock( | |
| 153 NSSCKFWMutex *mutex) | |
| 154 { | |
| 155 #ifdef NSSDEBUG | |
| 156 CK_RV rv = nssCKFWMutex_verifyPointer(mutex); | |
| 157 if (CKR_OK != rv) { | |
| 158 return rv; | |
| 159 } | |
| 160 #endif /* NSSDEBUG */ | |
| 161 if (mutex->lock) { | |
| 162 PR_Lock(mutex->lock); | |
| 163 } | |
| 164 | |
| 165 return CKR_OK; | |
| 166 } | |
| 167 | |
| 168 /* | |
| 169 * nssCKFWMutex_Unlock | |
| 170 * | |
| 171 */ | |
| 172 NSS_EXTERN CK_RV | |
| 173 nssCKFWMutex_Unlock( | |
| 174 NSSCKFWMutex *mutex) | |
| 175 { | |
| 176 PRStatus nrv; | |
| 177 #ifdef NSSDEBUG | |
| 178 CK_RV rv = nssCKFWMutex_verifyPointer(mutex); | |
| 179 | |
| 180 if (CKR_OK != rv) { | |
| 181 return rv; | |
| 182 } | |
| 183 #endif /* NSSDEBUG */ | |
| 184 | |
| 185 if (!mutex->lock) | |
| 186 return CKR_OK; | |
| 187 | |
| 188 nrv = PR_Unlock(mutex->lock); | |
| 189 | |
| 190 /* if unlock fails, either we have a programming error, or we have | |
| 191 * some sort of hardware failure... in either case return CKR_DEVICE_ERROR. | |
| 192 */ | |
| 193 return nrv == PR_SUCCESS ? CKR_OK : CKR_DEVICE_ERROR; | |
| 194 } | |
| 195 | |
| 196 /* | |
| 197 * NSSCKFWMutex_Destroy | |
| 198 * | |
| 199 */ | |
| 200 NSS_EXTERN CK_RV | |
| 201 NSSCKFWMutex_Destroy( | |
| 202 NSSCKFWMutex *mutex) | |
| 203 { | |
| 204 #ifdef DEBUG | |
| 205 CK_RV rv = nssCKFWMutex_verifyPointer(mutex); | |
| 206 if (CKR_OK != rv) { | |
| 207 return rv; | |
| 208 } | |
| 209 #endif /* DEBUG */ | |
| 210 | |
| 211 return nssCKFWMutex_Destroy(mutex); | |
| 212 } | |
| 213 | |
| 214 /* | |
| 215 * NSSCKFWMutex_Lock | |
| 216 * | |
| 217 */ | |
| 218 NSS_EXTERN CK_RV | |
| 219 NSSCKFWMutex_Lock( | |
| 220 NSSCKFWMutex *mutex) | |
| 221 { | |
| 222 #ifdef DEBUG | |
| 223 CK_RV rv = nssCKFWMutex_verifyPointer(mutex); | |
| 224 if (CKR_OK != rv) { | |
| 225 return rv; | |
| 226 } | |
| 227 #endif /* DEBUG */ | |
| 228 | |
| 229 return nssCKFWMutex_Lock(mutex); | |
| 230 } | |
| 231 | |
| 232 /* | |
| 233 * NSSCKFWMutex_Unlock | |
| 234 * | |
| 235 */ | |
| 236 NSS_EXTERN CK_RV | |
| 237 NSSCKFWMutex_Unlock( | |
| 238 NSSCKFWMutex *mutex) | |
| 239 { | |
| 240 #ifdef DEBUG | |
| 241 CK_RV rv = nssCKFWMutex_verifyPointer(mutex); | |
| 242 if (CKR_OK != rv) { | |
| 243 return rv; | |
| 244 } | |
| 245 #endif /* DEBUG */ | |
| 246 | |
| 247 return nssCKFWMutex_Unlock(mutex); | |
| 248 } | |
| OLD | NEW |