OLD | NEW |
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ | 1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 /* This Source Code Form is subject to the terms of the Mozilla Public | 2 /* This Source Code Form is subject to the terms of the Mozilla Public |
3 * License, v. 2.0. If a copy of the MPL was not distributed with this | 3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
5 | 5 |
6 /* | 6 /* |
7 ** File: ptsynch.c | 7 ** File: ptsynch.c |
8 ** Descritpion: Implemenation for thread synchronization using pthreads | 8 ** Descritpion: Implemenation for thread synchronization using pthreads |
9 ** Exports: prlock.h, prcvar.h, prmon.h, prcmon.h | 9 ** Exports: prlock.h, prcvar.h, prmon.h, prcmon.h |
10 */ | 10 */ |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 notified->cv[index].cv = cvar; | 315 notified->cv[index].cv = cvar; |
316 notified->length += 1; | 316 notified->length += 1; |
317 } /* pt_PostNotifyToCvar */ | 317 } /* pt_PostNotifyToCvar */ |
318 | 318 |
319 PR_IMPLEMENT(PRCondVar*) PR_NewCondVar(PRLock *lock) | 319 PR_IMPLEMENT(PRCondVar*) PR_NewCondVar(PRLock *lock) |
320 { | 320 { |
321 PRCondVar *cv = PR_NEW(PRCondVar); | 321 PRCondVar *cv = PR_NEW(PRCondVar); |
322 PR_ASSERT(lock != NULL); | 322 PR_ASSERT(lock != NULL); |
323 if (cv != NULL) | 323 if (cv != NULL) |
324 { | 324 { |
325 int rv = _PT_PTHREAD_COND_INIT(cv->cv, _pt_cvar_attr); | 325 int rv = _PT_PTHREAD_COND_INIT(cv->cv, _pt_cvar_attr); |
326 PR_ASSERT(0 == rv); | 326 PR_ASSERT(0 == rv); |
327 cv->lock = lock; | 327 if (0 == rv) |
328 cv->notify_pending = 0; | 328 { |
| 329 cv->lock = lock; |
| 330 cv->notify_pending = 0; |
329 #if defined(DEBUG) | 331 #if defined(DEBUG) |
330 pt_debug.cvars_created += 1; | 332 pt_debug.cvars_created += 1; |
331 #endif | 333 #endif |
| 334 } |
| 335 else |
| 336 { |
| 337 PR_DELETE(cv); |
| 338 cv = NULL; |
| 339 } |
332 } | 340 } |
333 return cv; | 341 return cv; |
334 } /* PR_NewCondVar */ | 342 } /* PR_NewCondVar */ |
335 | 343 |
336 PR_IMPLEMENT(void) PR_DestroyCondVar(PRCondVar *cvar) | 344 PR_IMPLEMENT(void) PR_DestroyCondVar(PRCondVar *cvar) |
337 { | 345 { |
338 if (0 > PR_ATOMIC_DECREMENT(&cvar->notify_pending)) | 346 if (0 > PR_ATOMIC_DECREMENT(&cvar->notify_pending)) |
339 { | 347 { |
340 PRIntn rv = pthread_cond_destroy(&cvar->cv); PR_ASSERT(0 == rv); | 348 PRIntn rv = pthread_cond_destroy(&cvar->cv); |
341 #if defined(DEBUG) | 349 #if defined(DEBUG) |
| 350 PR_ASSERT(0 == rv); |
342 memset(cvar, 0xaf, sizeof(PRCondVar)); | 351 memset(cvar, 0xaf, sizeof(PRCondVar)); |
343 pt_debug.cvars_destroyed += 1; | 352 pt_debug.cvars_destroyed += 1; |
| 353 #else |
| 354 (void)rv; |
344 #endif | 355 #endif |
345 PR_Free(cvar); | 356 PR_Free(cvar); |
346 } | 357 } |
347 } /* PR_DestroyCondVar */ | 358 } /* PR_DestroyCondVar */ |
348 | 359 |
349 PR_IMPLEMENT(PRStatus) PR_WaitCondVar(PRCondVar *cvar, PRIntervalTime timeout) | 360 PR_IMPLEMENT(PRStatus) PR_WaitCondVar(PRCondVar *cvar, PRIntervalTime timeout) |
350 { | 361 { |
351 PRIntn rv; | 362 PRIntn rv; |
352 PRThread *thred = PR_GetCurrentThread(); | 363 PRThread *thred = PR_GetCurrentThread(); |
353 | 364 |
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1174 PR_IMPLEMENT(PRCondVar*) PRP_NewNakedCondVar(void) | 1185 PR_IMPLEMENT(PRCondVar*) PRP_NewNakedCondVar(void) |
1175 { | 1186 { |
1176 PRCondVar *cv; | 1187 PRCondVar *cv; |
1177 | 1188 |
1178 if (!_pr_initialized) _PR_ImplicitInitialization(); | 1189 if (!_pr_initialized) _PR_ImplicitInitialization(); |
1179 | 1190 |
1180 cv = PR_NEW(PRCondVar); | 1191 cv = PR_NEW(PRCondVar); |
1181 if (cv != NULL) | 1192 if (cv != NULL) |
1182 { | 1193 { |
1183 int rv; | 1194 int rv; |
1184 rv = _PT_PTHREAD_COND_INIT(cv->cv, _pt_cvar_attr); | 1195 rv = _PT_PTHREAD_COND_INIT(cv->cv, _pt_cvar_attr); |
1185 PR_ASSERT(0 == rv); | 1196 PR_ASSERT(0 == rv); |
1186 cv->lock = _PR_NAKED_CV_LOCK; | 1197 if (0 == rv) |
| 1198 { |
| 1199 cv->lock = _PR_NAKED_CV_LOCK; |
| 1200 } |
| 1201 else |
| 1202 { |
| 1203 PR_DELETE(cv); |
| 1204 cv = NULL; |
| 1205 } |
1187 } | 1206 } |
1188 return cv; | 1207 return cv; |
1189 } /* PRP_NewNakedCondVar */ | 1208 } /* PRP_NewNakedCondVar */ |
1190 | 1209 |
1191 PR_IMPLEMENT(void) PRP_DestroyNakedCondVar(PRCondVar *cvar) | 1210 PR_IMPLEMENT(void) PRP_DestroyNakedCondVar(PRCondVar *cvar) |
1192 { | 1211 { |
1193 int rv; | 1212 int rv; |
1194 rv = pthread_cond_destroy(&cvar->cv); PR_ASSERT(0 == rv); | 1213 rv = pthread_cond_destroy(&cvar->cv); PR_ASSERT(0 == rv); |
1195 #if defined(DEBUG) | 1214 #if defined(DEBUG) |
1196 memset(cvar, 0xaf, sizeof(PRCondVar)); | 1215 memset(cvar, 0xaf, sizeof(PRCondVar)); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1231 int rv; | 1250 int rv; |
1232 PR_ASSERT(cvar != NULL); | 1251 PR_ASSERT(cvar != NULL); |
1233 rv = pthread_cond_broadcast(&cvar->cv); | 1252 rv = pthread_cond_broadcast(&cvar->cv); |
1234 PR_ASSERT(0 == rv); | 1253 PR_ASSERT(0 == rv); |
1235 return PR_SUCCESS; | 1254 return PR_SUCCESS; |
1236 } /* PRP_NakedBroadcast */ | 1255 } /* PRP_NakedBroadcast */ |
1237 | 1256 |
1238 #endif /* defined(_PR_PTHREADS) */ | 1257 #endif /* defined(_PR_PTHREADS) */ |
1239 | 1258 |
1240 /* ptsynch.c */ | 1259 /* ptsynch.c */ |
OLD | NEW |