summaryrefslogtreecommitdiff
path: root/source3/tdb/spinlock.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2003-12-09 22:41:26 +0000
committerJeremy Allison <jra@samba.org>2003-12-09 22:41:26 +0000
commit86d65dc07080c557863e2595be84d6fcbc338166 (patch)
tree0aa44107ca4d9ed75c3d323d93e0bccab4278696 /source3/tdb/spinlock.c
parentf2c6cec3395e66b33d067fec3d863477cb774a59 (diff)
downloadsamba-86d65dc07080c557863e2595be84d6fcbc338166.tar.gz
samba-86d65dc07080c557863e2595be84d6fcbc338166.tar.bz2
samba-86d65dc07080c557863e2595be84d6fcbc338166.zip
IRIX spinlock patch from James Peach <jpeach@sgi.com>.
Jeremy. (This used to be commit 1ae1987a002716e8aa0d4bc0dd68f580ad762e47)
Diffstat (limited to 'source3/tdb/spinlock.c')
-rw-r--r--source3/tdb/spinlock.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/source3/tdb/spinlock.c b/source3/tdb/spinlock.c
index 3fddeafb2c..3b3ebefded 100644
--- a/source3/tdb/spinlock.c
+++ b/source3/tdb/spinlock.c
@@ -143,6 +143,47 @@ static inline int __spin_is_locked(spinlock_t *lock)
return (*lock != 1);
}
+#elif defined(MIPS_SPINLOCKS) && defined(sgi) && (_COMPILER_VERSION >= 730)
+
+/* Implement spinlocks on IRIX using the MIPSPro atomic fetch operations. See
+ * sync(3) for the details of the intrinsic operations.
+ *
+ * "sgi" and "_COMPILER_VERSION" are always defined by MIPSPro.
+ */
+
+#if defined(STANDALONE)
+
+/* MIPSPro 7.3 has "__inline" as an extension, but not "inline. */
+#define inline __inline
+
+#endif /* STANDALONE */
+
+/* Returns 0 if the lock is acquired, EBUSY otherwise. */
+static inline int __spin_trylock(spinlock_t *lock)
+{
+ unsigned int val;
+ val = __lock_test_and_set(lock, 1);
+ return val == 0 ? 0 : EBUSY;
+}
+
+static inline void __spin_unlock(spinlock_t *lock)
+{
+ __lock_release(lock);
+}
+
+static inline void __spin_lock_init(spinlock_t *lock)
+{
+ __lock_release(lock);
+}
+
+/* Returns 1 if the lock is held, 0 otherwise. */
+static inline int __spin_is_locked(spinlock_t *lock)
+{
+ unsigned int val;
+ val = __add_and_fetch(lock, 0);
+ return val;
+}
+
#elif defined(MIPS_SPINLOCKS)
static inline unsigned int load_linked(unsigned long addr)
@@ -221,7 +262,11 @@ static void yield_cpu(void)
static int this_is_smp(void)
{
+#if defined(HAVE_SYSCONF) && defined(SYSCONF_SC_NPROC_ONLN)
+ return (sysconf(_SC_NPROC_ONLN) > 1) ? 1 : 0;
+#else
return 0;
+#endif
}
/*