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