Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Side by Side Diff: nss/lib/base/tracker.c

Issue 1843333003: Update NSPR to 4.12 and NSS to 3.23 on iOS (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/nss.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* This Source Code Form is subject to the terms of the Mozilla Public 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 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/. */ 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 4
5 /* 5 /*
6 * tracker.c 6 * tracker.c
7 * 7 *
8 * This file contains the code used by the pointer-tracking calls used 8 * This file contains the code used by the pointer-tracking calls used
9 * in the debug builds to catch bad pointers. The entire contents are 9 * in the debug builds to catch bad pointers. The entire contents are
10 * only available in debug builds (both internal and external builds). 10 * only available in debug builds (both internal and external builds).
11 */ 11 */
12 12
13 #ifndef BASE_H 13 #ifndef BASE_H
14 #include "base.h" 14 #include "base.h"
15 #endif /* BASE_H */ 15 #endif /* BASE_H */
16 16
17 #ifdef DEBUG 17 #ifdef DEBUG
18 /* 18 /*
19 * identity_hash 19 * identity_hash
20 * 20 *
21 * This static callback is a PLHashFunction as defined in plhash.h 21 * This static callback is a PLHashFunction as defined in plhash.h
22 * It merely returns the value of the object pointer as its hash. 22 * It merely returns the value of the object pointer as its hash.
23 * There are no possible errors. 23 * There are no possible errors.
24 */ 24 */
25 25
26 static PLHashNumber PR_CALLBACK 26 static PLHashNumber PR_CALLBACK
27 identity_hash 27 identity_hash(const void *key)
28 (
29 const void *key
30 )
31 { 28 {
32 return (PLHashNumber)((char *)key - (char *)NULL); 29 return (PLHashNumber)((char *)key - (char *)NULL);
33 } 30 }
34 31
35 /* 32 /*
36 * trackerOnceFunc 33 * trackerOnceFunc
37 * 34 *
38 * This function is called once, using the nssCallOnce function above. 35 * This function is called once, using the nssCallOnce function above.
39 * It creates a new pointer tracker object; initialising its hash 36 * It creates a new pointer tracker object; initialising its hash
40 * table and protective lock. 37 * table and protective lock.
41 */ 38 */
42 39
43 static PRStatus 40 static PRStatus
44 trackerOnceFunc 41 trackerOnceFunc(void *arg)
45 (
46 void *arg
47 )
48 { 42 {
49 nssPointerTracker *tracker = (nssPointerTracker *)arg; 43 nssPointerTracker *tracker = (nssPointerTracker *)arg;
50 44
51 tracker->lock = PZ_NewLock(nssILockOther); 45 tracker->lock = PZ_NewLock(nssILockOther);
52 if( (PZLock *)NULL == tracker->lock ) { 46 if ((PZLock *)NULL == tracker->lock) {
53 return PR_FAILURE; 47 return PR_FAILURE;
54 } 48 }
55 49
56 tracker->table = PL_NewHashTable(0, 50 tracker->table =
57 identity_hash, 51 PL_NewHashTable(0, identity_hash, PL_CompareValues, PL_CompareValues,
58 PL_CompareValues, 52 (PLHashAllocOps *)NULL, (void *)NULL);
59 PL_CompareValues, 53 if ((PLHashTable *)NULL == tracker->table) {
60 (PLHashAllocOps *)NULL, 54 PZ_DestroyLock(tracker->lock);
61 (void *)NULL); 55 tracker->lock = (PZLock *)NULL;
62 if( (PLHashTable *)NULL == tracker->table ) { 56 return PR_FAILURE;
63 PZ_DestroyLock(tracker->lock); 57 }
64 tracker->lock = (PZLock *)NULL;
65 return PR_FAILURE;
66 }
67 58
68 return PR_SUCCESS; 59 return PR_SUCCESS;
69 } 60 }
70 61
71 /* 62 /*
72 * nssPointerTracker_initialize 63 * nssPointerTracker_initialize
73 * 64 *
74 * This method is only present in debug builds. 65 * This method is only present in debug builds.
75 * 66 *
76 * This routine initializes an nssPointerTracker object. Note that 67 * This routine initializes an nssPointerTracker object. Note that
77 * the object must have been declared *static* to guarantee that it 68 * the object must have been declared *static* to guarantee that it
78 * is in a zeroed state initially. This routine is idempotent, and 69 * is in a zeroed state initially. This routine is idempotent, and
79 * may even be safely called by multiple threads simultaneously with 70 * may even be safely called by multiple threads simultaneously with
80 * the same argument. This routine returns a PRStatus value; if 71 * the same argument. This routine returns a PRStatus value; if
81 * successful, it will return PR_SUCCESS. On failure it will set an 72 * successful, it will return PR_SUCCESS. On failure it will set an
82 * error on the error stack and return PR_FAILURE. 73 * error on the error stack and return PR_FAILURE.
83 * 74 *
84 * The error may be one of the following values: 75 * The error may be one of the following values:
85 * NSS_ERROR_NO_MEMORY 76 * NSS_ERROR_NO_MEMORY
86 * 77 *
87 * Return value: 78 * Return value:
88 * PR_SUCCESS 79 * PR_SUCCESS
89 * PR_FAILURE 80 * PR_FAILURE
90 */ 81 */
91 82
92 NSS_IMPLEMENT PRStatus 83 NSS_IMPLEMENT PRStatus
93 nssPointerTracker_initialize 84 nssPointerTracker_initialize(nssPointerTracker *tracker)
94 (
95 nssPointerTracker *tracker
96 )
97 { 85 {
98 PRStatus rv = PR_CallOnceWithArg(&tracker->once, trackerOnceFunc, tracker); 86 PRStatus rv = PR_CallOnceWithArg(&tracker->once, trackerOnceFunc, tracker);
99 if( PR_SUCCESS != rv ) { 87 if (PR_SUCCESS != rv) {
100 nss_SetError(NSS_ERROR_NO_MEMORY); 88 nss_SetError(NSS_ERROR_NO_MEMORY);
101 } 89 }
102 90
103 return rv; 91 return rv;
104 } 92 }
105 93
106 #ifdef DONT_DESTROY_EMPTY_TABLES 94 #ifdef DONT_DESTROY_EMPTY_TABLES
107 /* See same #ifdef below */ 95 /* See same #ifdef below */
108 /* 96 /*
109 * count_entries 97 * count_entries
110 * 98 *
111 * This static routine is a PLHashEnumerator, as defined in plhash.h. 99 * This static routine is a PLHashEnumerator, as defined in plhash.h.
112 * It merely causes the enumeration function to count the number of 100 * It merely causes the enumeration function to count the number of
113 * entries. 101 * entries.
114 */ 102 */
115 103
116 static PRIntn PR_CALLBACK 104 static PRIntn PR_CALLBACK
117 count_entries 105 count_entries(PLHashEntry *he, PRIntn index, void *arg)
118 (
119 PLHashEntry *he,
120 PRIntn index,
121 void *arg
122 )
123 { 106 {
124 return HT_ENUMERATE_NEXT; 107 return HT_ENUMERATE_NEXT;
125 } 108 }
126 #endif /* DONT_DESTROY_EMPTY_TABLES */ 109 #endif /* DONT_DESTROY_EMPTY_TABLES */
127 110
128 /* 111 /*
129 * zero_once 112 * zero_once
130 * 113 *
131 * This is a guaranteed zeroed once block. It's used to help clear 114 * This is a guaranteed zeroed once block. It's used to help clear
132 * the tracker. 115 * the tracker.
133 */ 116 */
134 117
135 static const PRCallOnceType zero_once; 118 static const PRCallOnceType zero_once;
136 119
137 /* 120 /*
138 * nssPointerTracker_finalize 121 * nssPointerTracker_finalize
139 * 122 *
140 * This method is only present in debug builds. 123 * This method is only present in debug builds.
141 * 124 *
142 * This routine returns the nssPointerTracker object to the pre- 125 * This routine returns the nssPointerTracker object to the pre-
143 * initialized state, releasing all resources used by the object. 126 * initialized state, releasing all resources used by the object.
144 * It will *NOT* destroy the objects being tracked by the pointer 127 * It will *NOT* destroy the objects being tracked by the pointer
145 * (should any remain), and therefore cannot be used to "sweep up" 128 * (should any remain), and therefore cannot be used to "sweep up"
146 * remaining objects. This routine returns a PRStatus value; if 129 * remaining objects. This routine returns a PRStatus value; if
147 * successful, it will return PR_SUCCES. On failure it will set an 130 * successful, it will return PR_SUCCES. On failure it will set an
148 * error on the error stack and return PR_FAILURE. If any objects 131 * error on the error stack and return PR_FAILURE. If any objects
149 * remain in the tracker when it is finalized, that will be treated 132 * remain in the tracker when it is finalized, that will be treated
150 * as an error. 133 * as an error.
151 * 134 *
152 * The error may be one of the following values: 135 * The error may be one of the following values:
153 * NSS_ERROR_INVALID_POINTER 136 * NSS_ERROR_INVALID_POINTER
154 * NSS_ERROR_TRACKER_NOT_INITIALIZED 137 * NSS_ERROR_TRACKER_NOT_INITIALIZED
155 * NSS_ERROR_TRACKER_NOT_EMPTY 138 * NSS_ERROR_TRACKER_NOT_EMPTY
156 * 139 *
157 * Return value: 140 * Return value:
158 * PR_SUCCESS 141 * PR_SUCCESS
159 * PR_FAILURE 142 * PR_FAILURE
160 */ 143 */
161 144
162 NSS_IMPLEMENT PRStatus 145 NSS_IMPLEMENT PRStatus
163 nssPointerTracker_finalize 146 nssPointerTracker_finalize(nssPointerTracker *tracker)
164 (
165 nssPointerTracker *tracker
166 )
167 { 147 {
168 PZLock *lock; 148 PZLock *lock;
169 149
170 if( (nssPointerTracker *)NULL == tracker ) { 150 if ((nssPointerTracker *)NULL == tracker) {
171 nss_SetError(NSS_ERROR_INVALID_POINTER); 151 nss_SetError(NSS_ERROR_INVALID_POINTER);
172 return PR_FAILURE; 152 return PR_FAILURE;
173 } 153 }
174 154
175 if( (PZLock *)NULL == tracker->lock ) { 155 if ((PZLock *)NULL == tracker->lock) {
176 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); 156 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
177 return PR_FAILURE; 157 return PR_FAILURE;
178 } 158 }
179 159
180 lock = tracker->lock; 160 lock = tracker->lock;
181 PZ_Lock(lock); 161 PZ_Lock(lock);
182 162
183 if( (PLHashTable *)NULL == tracker->table ) { 163 if ((PLHashTable *)NULL == tracker->table) {
184 PZ_Unlock(lock); 164 PZ_Unlock(lock);
185 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); 165 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
186 return PR_FAILURE; 166 return PR_FAILURE;
187 } 167 }
188 168
189 #ifdef DONT_DESTROY_EMPTY_TABLES 169 #ifdef DONT_DESTROY_EMPTY_TABLES
190 /* 170 /*
191 * I changed my mind; I think we don't want this after all. 171 * I changed my mind; I think we don't want this after all.
192 * Comments? 172 * Comments?
193 */ 173 */
194 count = PL_HashTableEnumerateEntries(tracker->table, 174 count = PL_HashTableEnumerateEntries(tracker->table, count_entries,
195 count_entries, 175 (void *)NULL);
196 (void *)NULL);
197 176
198 if( 0 != count ) { 177 if (0 != count) {
199 PZ_Unlock(lock); 178 PZ_Unlock(lock);
200 nss_SetError(NSS_ERROR_TRACKER_NOT_EMPTY); 179 nss_SetError(NSS_ERROR_TRACKER_NOT_EMPTY);
201 return PR_FAILURE; 180 return PR_FAILURE;
202 } 181 }
203 #endif /* DONT_DESTROY_EMPTY_TABLES */ 182 #endif /* DONT_DESTROY_EMPTY_TABLES */
204 183
205 PL_HashTableDestroy(tracker->table); 184 PL_HashTableDestroy(tracker->table);
206 /* memset(tracker, 0, sizeof(nssPointerTracker)); */ 185 /* memset(tracker, 0, sizeof(nssPointerTracker)); */
207 tracker->once = zero_once; 186 tracker->once = zero_once;
208 tracker->lock = (PZLock *)NULL; 187 tracker->lock = (PZLock *)NULL;
209 tracker->table = (PLHashTable *)NULL; 188 tracker->table = (PLHashTable *)NULL;
210 189
211 PZ_Unlock(lock); 190 PZ_Unlock(lock);
212 PZ_DestroyLock(lock); 191 PZ_DestroyLock(lock);
213 192
214 return PR_SUCCESS; 193 return PR_SUCCESS;
215 } 194 }
216 195
217 /* 196 /*
218 * nssPointerTracker_add 197 * nssPointerTracker_add
219 * 198 *
220 * This method is only present in debug builds. 199 * This method is only present in debug builds.
221 * 200 *
222 * This routine adds the specified pointer to the nssPointerTracker 201 * This routine adds the specified pointer to the nssPointerTracker
223 * object. It should be called in constructor objects to register 202 * object. It should be called in constructor objects to register
224 * new valid objects. The nssPointerTracker is threadsafe, but this 203 * new valid objects. The nssPointerTracker is threadsafe, but this
225 * call is not idempotent. This routine returns a PRStatus value; 204 * call is not idempotent. This routine returns a PRStatus value;
226 * if successful it will return PR_SUCCESS. On failure it will set 205 * if successful it will return PR_SUCCESS. On failure it will set
227 * an error on the error stack and return PR_FAILURE. 206 * an error on the error stack and return PR_FAILURE.
228 * 207 *
229 * The error may be one of the following values: 208 * The error may be one of the following values:
230 * NSS_ERROR_INVALID_POINTER 209 * NSS_ERROR_INVALID_POINTER
231 * NSS_ERROR_NO_MEMORY 210 * NSS_ERROR_NO_MEMORY
232 * NSS_ERROR_TRACKER_NOT_INITIALIZED 211 * NSS_ERROR_TRACKER_NOT_INITIALIZED
233 * NSS_ERROR_DUPLICATE_POINTER 212 * NSS_ERROR_DUPLICATE_POINTER
234 * 213 *
235 * Return value: 214 * Return value:
236 * PR_SUCCESS 215 * PR_SUCCESS
237 * PR_FAILURE 216 * PR_FAILURE
238 */ 217 */
239 218
240 NSS_IMPLEMENT PRStatus 219 NSS_IMPLEMENT PRStatus
241 nssPointerTracker_add 220 nssPointerTracker_add(nssPointerTracker *tracker, const void *pointer)
242 (
243 nssPointerTracker *tracker,
244 const void *pointer
245 )
246 { 221 {
247 void *check; 222 void *check;
248 PLHashEntry *entry; 223 PLHashEntry *entry;
249 224
250 if( (nssPointerTracker *)NULL == tracker ) { 225 if ((nssPointerTracker *)NULL == tracker) {
251 nss_SetError(NSS_ERROR_INVALID_POINTER); 226 nss_SetError(NSS_ERROR_INVALID_POINTER);
252 return PR_FAILURE; 227 return PR_FAILURE;
253 } 228 }
254 229
255 if( (PZLock *)NULL == tracker->lock ) { 230 if ((PZLock *)NULL == tracker->lock) {
256 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); 231 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
257 return PR_FAILURE; 232 return PR_FAILURE;
258 } 233 }
259 234
260 PZ_Lock(tracker->lock); 235 PZ_Lock(tracker->lock);
261 236
262 if( (PLHashTable *)NULL == tracker->table ) { 237 if ((PLHashTable *)NULL == tracker->table) {
238 PZ_Unlock(tracker->lock);
239 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
240 return PR_FAILURE;
241 }
242
243 check = PL_HashTableLookup(tracker->table, pointer);
244 if ((void *)NULL != check) {
245 PZ_Unlock(tracker->lock);
246 nss_SetError(NSS_ERROR_DUPLICATE_POINTER);
247 return PR_FAILURE;
248 }
249
250 entry = PL_HashTableAdd(tracker->table, pointer, (void *)pointer);
251
263 PZ_Unlock(tracker->lock); 252 PZ_Unlock(tracker->lock);
264 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
265 return PR_FAILURE;
266 }
267 253
268 check = PL_HashTableLookup(tracker->table, pointer); 254 if ((PLHashEntry *)NULL == entry) {
269 if( (void *)NULL != check ) { 255 nss_SetError(NSS_ERROR_NO_MEMORY);
270 PZ_Unlock(tracker->lock); 256 return PR_FAILURE;
271 nss_SetError(NSS_ERROR_DUPLICATE_POINTER); 257 }
272 return PR_FAILURE;
273 }
274 258
275 entry = PL_HashTableAdd(tracker->table, pointer, (void *)pointer); 259 return PR_SUCCESS;
260 }
276 261
277 PZ_Unlock(tracker->lock);
278
279 if( (PLHashEntry *)NULL == entry ) {
280 nss_SetError(NSS_ERROR_NO_MEMORY);
281 return PR_FAILURE;
282 }
283
284 return PR_SUCCESS;
285 }
286
287 /* 262 /*
288 * nssPointerTracker_remove 263 * nssPointerTracker_remove
289 * 264 *
290 * This method is only present in debug builds. 265 * This method is only present in debug builds.
291 * 266 *
292 * This routine removes the specified pointer from the 267 * This routine removes the specified pointer from the
293 * nssPointerTracker object. It does not call any destructor for the 268 * nssPointerTracker object. It does not call any destructor for the
294 * object; rather, this should be called from the object's destructor. 269 * object; rather, this should be called from the object's destructor.
295 * The nssPointerTracker is threadsafe, but this call is not 270 * The nssPointerTracker is threadsafe, but this call is not
296 * idempotent. This routine returns a PRStatus value; if successful 271 * idempotent. This routine returns a PRStatus value; if successful
297 * it will return PR_SUCCESS. On failure it will set an error on the 272 * it will return PR_SUCCESS. On failure it will set an error on the
298 * error stack and return PR_FAILURE. 273 * error stack and return PR_FAILURE.
299 * 274 *
300 * The error may be one of the following values: 275 * The error may be one of the following values:
301 * NSS_ERROR_INVALID_POINTER 276 * NSS_ERROR_INVALID_POINTER
302 * NSS_ERROR_TRACKER_NOT_INITIALIZED 277 * NSS_ERROR_TRACKER_NOT_INITIALIZED
303 * NSS_ERROR_POINTER_NOT_REGISTERED 278 * NSS_ERROR_POINTER_NOT_REGISTERED
304 * 279 *
305 * Return value: 280 * Return value:
306 * PR_SUCCESS 281 * PR_SUCCESS
307 * PR_FAILURE 282 * PR_FAILURE
308 */ 283 */
309 284
310 NSS_IMPLEMENT PRStatus 285 NSS_IMPLEMENT PRStatus
311 nssPointerTracker_remove 286 nssPointerTracker_remove(nssPointerTracker *tracker, const void *pointer)
312 (
313 nssPointerTracker *tracker,
314 const void *pointer
315 )
316 { 287 {
317 PRBool registered; 288 PRBool registered;
318 289
319 if( (nssPointerTracker *)NULL == tracker ) { 290 if ((nssPointerTracker *)NULL == tracker) {
320 nss_SetError(NSS_ERROR_INVALID_POINTER); 291 nss_SetError(NSS_ERROR_INVALID_POINTER);
321 return PR_FAILURE; 292 return PR_FAILURE;
322 } 293 }
323 294
324 if( (PZLock *)NULL == tracker->lock ) { 295 if ((PZLock *)NULL == tracker->lock) {
325 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); 296 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
326 return PR_FAILURE; 297 return PR_FAILURE;
327 } 298 }
328 299
329 PZ_Lock(tracker->lock); 300 PZ_Lock(tracker->lock);
330 301
331 if( (PLHashTable *)NULL == tracker->table ) { 302 if ((PLHashTable *)NULL == tracker->table) {
303 PZ_Unlock(tracker->lock);
304 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
305 return PR_FAILURE;
306 }
307
308 registered = PL_HashTableRemove(tracker->table, pointer);
332 PZ_Unlock(tracker->lock); 309 PZ_Unlock(tracker->lock);
333 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
334 return PR_FAILURE;
335 }
336 310
337 registered = PL_HashTableRemove(tracker->table, pointer); 311 if (!registered) {
338 PZ_Unlock(tracker->lock); 312 nss_SetError(NSS_ERROR_POINTER_NOT_REGISTERED);
313 return PR_FAILURE;
314 }
339 315
340 if( !registered ) { 316 return PR_SUCCESS;
341 nss_SetError(NSS_ERROR_POINTER_NOT_REGISTERED);
342 return PR_FAILURE;
343 }
344
345 return PR_SUCCESS;
346 } 317 }
347 318
348 /* 319 /*
349 * nssPointerTracker_verify 320 * nssPointerTracker_verify
350 * 321 *
351 * This method is only present in debug builds. 322 * This method is only present in debug builds.
352 * 323 *
353 * This routine verifies that the specified pointer has been registered 324 * This routine verifies that the specified pointer has been registered
354 * with the nssPointerTracker object. The nssPointerTracker object is 325 * with the nssPointerTracker object. The nssPointerTracker object is
355 * threadsafe, and this call may be safely called from multiple threads 326 * threadsafe, and this call may be safely called from multiple threads
356 * simultaneously with the same arguments. This routine returns a 327 * simultaneously with the same arguments. This routine returns a
357 * PRStatus value; if the pointer is registered this will return 328 * PRStatus value; if the pointer is registered this will return
358 * PR_SUCCESS. Otherwise it will set an error on the error stack and 329 * PR_SUCCESS. Otherwise it will set an error on the error stack and
359 * return PR_FAILURE. Although the error is suitable for leaving on 330 * return PR_FAILURE. Although the error is suitable for leaving on
360 * the stack, callers may wish to augment the information available by 331 * the stack, callers may wish to augment the information available by
361 * placing a more type-specific error on the stack. 332 * placing a more type-specific error on the stack.
362 * 333 *
363 * The error may be one of the following values: 334 * The error may be one of the following values:
364 * NSS_ERROR_INVALID_POINTER 335 * NSS_ERROR_INVALID_POINTER
365 * NSS_ERROR_TRACKER_NOT_INITIALIZED 336 * NSS_ERROR_TRACKER_NOT_INITIALIZED
366 * NSS_ERROR_POINTER_NOT_REGISTERED 337 * NSS_ERROR_POINTER_NOT_REGISTERED
367 * 338 *
368 * Return value: 339 * Return value:
369 * PR_SUCCESS 340 * PR_SUCCESS
370 * PR_FAILRUE 341 * PR_FAILRUE
371 */ 342 */
372 343
373 NSS_IMPLEMENT PRStatus 344 NSS_IMPLEMENT PRStatus
374 nssPointerTracker_verify 345 nssPointerTracker_verify(nssPointerTracker *tracker, const void *pointer)
375 (
376 nssPointerTracker *tracker,
377 const void *pointer
378 )
379 { 346 {
380 void *check; 347 void *check;
381 348
382 if( (nssPointerTracker *)NULL == tracker ) { 349 if ((nssPointerTracker *)NULL == tracker) {
383 nss_SetError(NSS_ERROR_INVALID_POINTER); 350 nss_SetError(NSS_ERROR_INVALID_POINTER);
384 return PR_FAILURE; 351 return PR_FAILURE;
385 } 352 }
386 353
387 if( (PZLock *)NULL == tracker->lock ) { 354 if ((PZLock *)NULL == tracker->lock) {
388 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED); 355 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
389 return PR_FAILURE; 356 return PR_FAILURE;
390 } 357 }
391 358
392 PZ_Lock(tracker->lock); 359 PZ_Lock(tracker->lock);
393 360
394 if( (PLHashTable *)NULL == tracker->table ) { 361 if ((PLHashTable *)NULL == tracker->table) {
362 PZ_Unlock(tracker->lock);
363 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
364 return PR_FAILURE;
365 }
366
367 check = PL_HashTableLookup(tracker->table, pointer);
395 PZ_Unlock(tracker->lock); 368 PZ_Unlock(tracker->lock);
396 nss_SetError(NSS_ERROR_TRACKER_NOT_INITIALIZED);
397 return PR_FAILURE;
398 }
399 369
400 check = PL_HashTableLookup(tracker->table, pointer); 370 if ((void *)NULL == check) {
401 PZ_Unlock(tracker->lock); 371 nss_SetError(NSS_ERROR_POINTER_NOT_REGISTERED);
372 return PR_FAILURE;
373 }
402 374
403 if( (void *)NULL == check ) { 375 return PR_SUCCESS;
404 nss_SetError(NSS_ERROR_POINTER_NOT_REGISTERED);
405 return PR_FAILURE;
406 }
407
408 return PR_SUCCESS;
409 } 376 }
410 377
411 #endif /* DEBUG */ 378 #endif /* DEBUG */
OLDNEW
« no previous file with comments | « nss/lib/base/nssutf8.c ('k') | nss/lib/certdb/alg1485.c » ('j') | nss/lib/util/secoid.c » ('J')

Powered by Google App Engine
This is Rietveld 408576698