summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtc%netscape.com <devnull@localhost>1999-02-02 00:08:25 +0000
committerwtc%netscape.com <devnull@localhost>1999-02-02 00:08:25 +0000
commit167daa3cc206c5720c2270b12c584e76e3dab543 (patch)
tree84089abd581d0fa479c82db7eef63b30646ec839
parentd766ed89288bc7cc127a1331748e1382bb35000e (diff)
downloadnspr-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.c58
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 */