You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
3.0 KiB
77 lines
3.0 KiB
diff --git a/pr/include/md/_linux.h b/pr/include/md/_linux.h |
|
--- a/pr/include/md/_linux.h |
|
+++ b/pr/include/md/_linux.h |
|
@@ -82,53 +82,73 @@ |
|
#define NO_DLOPEN_NULL |
|
#endif |
|
|
|
#if defined(__FreeBSD_kernel__) || defined(__GNU__) |
|
#define _PR_HAVE_SOCKADDR_LEN |
|
#endif |
|
|
|
#if defined(__i386__) |
|
+#if defined(__GNUC__) |
|
+/* Use GCC built-in functions */ |
|
+#define _PR_HAVE_ATOMIC_OPS |
|
+#define _MD_INIT_ATOMIC() |
|
+#define _MD_ATOMIC_INCREMENT(ptr) __sync_add_and_fetch(ptr, 1) |
|
+#define _MD_ATOMIC_DECREMENT(ptr) __sync_sub_and_fetch(ptr, 1) |
|
+#define _MD_ATOMIC_ADD(ptr, i) __sync_add_and_fetch(ptr, i) |
|
+#define _MD_ATOMIC_SET(ptr, nv) __sync_lock_test_and_set(ptr, nv) |
|
+#else |
|
#define _PR_HAVE_ATOMIC_OPS |
|
#define _MD_INIT_ATOMIC() |
|
extern PRInt32 _PR_x86_AtomicIncrement(PRInt32 *val); |
|
#define _MD_ATOMIC_INCREMENT _PR_x86_AtomicIncrement |
|
extern PRInt32 _PR_x86_AtomicDecrement(PRInt32 *val); |
|
#define _MD_ATOMIC_DECREMENT _PR_x86_AtomicDecrement |
|
extern PRInt32 _PR_x86_AtomicAdd(PRInt32 *ptr, PRInt32 val); |
|
#define _MD_ATOMIC_ADD _PR_x86_AtomicAdd |
|
extern PRInt32 _PR_x86_AtomicSet(PRInt32 *val, PRInt32 newval); |
|
#define _MD_ATOMIC_SET _PR_x86_AtomicSet |
|
#endif |
|
+#endif |
|
|
|
#if defined(__ia64__) |
|
#define _PR_HAVE_ATOMIC_OPS |
|
#define _MD_INIT_ATOMIC() |
|
extern PRInt32 _PR_ia64_AtomicIncrement(PRInt32 *val); |
|
#define _MD_ATOMIC_INCREMENT _PR_ia64_AtomicIncrement |
|
extern PRInt32 _PR_ia64_AtomicDecrement(PRInt32 *val); |
|
#define _MD_ATOMIC_DECREMENT _PR_ia64_AtomicDecrement |
|
extern PRInt32 _PR_ia64_AtomicAdd(PRInt32 *ptr, PRInt32 val); |
|
#define _MD_ATOMIC_ADD _PR_ia64_AtomicAdd |
|
extern PRInt32 _PR_ia64_AtomicSet(PRInt32 *val, PRInt32 newval); |
|
#define _MD_ATOMIC_SET _PR_ia64_AtomicSet |
|
#endif |
|
|
|
#if defined(__x86_64__) |
|
+#if defined(__GNUC__) |
|
+/* Use GCC built-in functions */ |
|
+#define _PR_HAVE_ATOMIC_OPS |
|
+#define _MD_INIT_ATOMIC() |
|
+#define _MD_ATOMIC_INCREMENT(ptr) __sync_add_and_fetch(ptr, 1) |
|
+#define _MD_ATOMIC_DECREMENT(ptr) __sync_sub_and_fetch(ptr, 1) |
|
+#define _MD_ATOMIC_ADD(ptr, i) __sync_add_and_fetch(ptr, i) |
|
+#define _MD_ATOMIC_SET(ptr, nv) __sync_lock_test_and_set(ptr, nv) |
|
+#else |
|
#define _PR_HAVE_ATOMIC_OPS |
|
#define _MD_INIT_ATOMIC() |
|
extern PRInt32 _PR_x86_64_AtomicIncrement(PRInt32 *val); |
|
#define _MD_ATOMIC_INCREMENT _PR_x86_64_AtomicIncrement |
|
extern PRInt32 _PR_x86_64_AtomicDecrement(PRInt32 *val); |
|
#define _MD_ATOMIC_DECREMENT _PR_x86_64_AtomicDecrement |
|
extern PRInt32 _PR_x86_64_AtomicAdd(PRInt32 *ptr, PRInt32 val); |
|
#define _MD_ATOMIC_ADD _PR_x86_64_AtomicAdd |
|
extern PRInt32 _PR_x86_64_AtomicSet(PRInt32 *val, PRInt32 newval); |
|
#define _MD_ATOMIC_SET _PR_x86_64_AtomicSet |
|
#endif |
|
+#endif |
|
|
|
#if defined(__or1k__) |
|
#if defined(__GNUC__) |
|
/* Use GCC built-in functions */ |
|
#define _PR_HAVE_ATOMIC_OPS |
|
#define _MD_INIT_ATOMIC() |
|
#define _MD_ATOMIC_INCREMENT(ptr) __sync_add_and_fetch(ptr, 1) |
|
#define _MD_ATOMIC_DECREMENT(ptr) __sync_sub_and_fetch(ptr, 1)
|
|
|