diff options
author | wtc%netscape.com <devnull@localhost> | 1999-02-02 00:08:25 +0000 |
---|---|---|
committer | wtc%netscape.com <devnull@localhost> | 1999-02-02 00:08:25 +0000 |
commit | 167daa3cc206c5720c2270b12c584e76e3dab543 (patch) | |
tree | 84089abd581d0fa479c82db7eef63b30646ec839 | |
parent | d766ed89288bc7cc127a1331748e1382bb35000e (diff) | |
download | nspr-hg-167daa3cc206c5720c2270b12c584e76e3dab543.tar.gz |
Bugsplat bug #340658: implemented a version of the atomic routines
for the pthreads version that doesn't require NSPR to be initialized.
-rw-r--r-- | pr/src/misc/pratom.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/pr/src/misc/pratom.c b/pr/src/misc/pratom.c index d7c1809c..f2663b79 100644 --- a/pr/src/misc/pratom.c +++ b/pr/src/misc/pratom.c @@ -39,6 +39,63 @@ * The lock contention should be acceptable. */ +#if defined(_PR_PTHREADS) && !defined(_PR_DCETHREADS) +/* + * PR_AtomicDecrement() is used in NSPR's thread-specific data + * destructor. Because thread-specific data destructors may be + * invoked after a PR_Cleanup() call, we need an implementation + * of the atomic routines that doesn't need NSPR to be initialized. + */ +static pthread_mutex_t atomic_lock = PTHREAD_MUTEX_INITIALIZER; +void _PR_MD_INIT_ATOMIC() +{ +} + +PRInt32 +_PR_MD_ATOMIC_INCREMENT(PRInt32 *val) +{ + PRInt32 rv; + + pthread_mutex_lock(&atomic_lock); + rv = ++(*val); + pthread_mutex_unlock(&atomic_lock); + return rv; +} + +PRInt32 +_PR_MD_ATOMIC_ADD(PRInt32 *ptr, PRInt32 val) +{ + PRInt32 rv; + + pthread_mutex_lock(&atomic_lock); + rv = ((*ptr) += val); + pthread_mutex_unlock(&atomic_lock); + return rv; +} + +PRInt32 +_PR_MD_ATOMIC_DECREMENT(PRInt32 *val) +{ + PRInt32 rv; + + pthread_mutex_lock(&atomic_lock); + rv = --(*val); + pthread_mutex_unlock(&atomic_lock); + return rv; +} + +PRInt32 +_PR_MD_ATOMIC_SET(PRInt32 *val, PRInt32 newval) +{ + PRInt32 rv; + + pthread_mutex_lock(&atomic_lock); + rv = *val; + *val = newval; + pthread_mutex_unlock(&atomic_lock); + return rv; +} +#else /* _PR_PTHREADS && !_PR_DCETHREADS */ static PRLock *atomic_lock = NULL; void _PR_MD_INIT_ATOMIC() { @@ -103,6 +160,7 @@ _PR_MD_ATOMIC_SET(PRInt32 *val, PRInt32 newval) PR_Unlock(atomic_lock); return rv; } +#endif /* _PR_PTHREADS && !_PR_DCETHREADS */ #endif /* !_PR_HAVE_ATOMIC_OPS */ |