summaryrefslogtreecommitdiff
path: root/source3/tdb/spinlock.h
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2000-12-06 00:05:15 +0000
committerJeremy Allison <jra@samba.org>2000-12-06 00:05:15 +0000
commit7e4c4721b4fbfa71ce6712ec5b9f3e8e8a105147 (patch)
tree2df359e8d49573fd79674cbb8cd592ce896a93d0 /source3/tdb/spinlock.h
parent1cd8538b7abf0970082074d7a114bb9d013d00b2 (diff)
downloadsamba-7e4c4721b4fbfa71ce6712ec5b9f3e8e8a105147.tar.gz
samba-7e4c4721b4fbfa71ce6712ec5b9f3e8e8a105147.tar.bz2
samba-7e4c4721b4fbfa71ce6712ec5b9f3e8e8a105147.zip
Changed to sourceforge tdb code. This includes spinlocks (so we now have
a --with-spinlocks option to configure, this does mean the on-disk tdb format has changed, so 2.2alphaX sites will need to re-create their tdb's. The upside is no more tdb fragmentation and a +5% on netbench. Swings and roundabouts.... Jeremy. (This used to be commit 9dea7b7c257db487f8ced7dad3fce92fba03ea91)
Diffstat (limited to 'source3/tdb/spinlock.h')
-rw-r--r--source3/tdb/spinlock.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/source3/tdb/spinlock.h b/source3/tdb/spinlock.h
new file mode 100644
index 0000000000..a0dd9cbca5
--- /dev/null
+++ b/source3/tdb/spinlock.h
@@ -0,0 +1,55 @@
+#ifndef __SPINLOCK_H__
+#define __SPINLOCK_H__
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "tdb.h"
+
+#ifdef USE_SPINLOCKS
+
+#define RWLOCK_BIAS 0x1000UL
+
+/* OS SPECIFIC */
+#define MAX_BUSY_LOOPS 1000
+#undef USE_SCHED_YIELD
+
+/* ARCH SPECIFIC */
+/* We should make sure these are padded to a cache line */
+#if defined(SPARC_SPINLOCKS)
+typedef volatile char spinlock_t;
+#elif defined(POWERPC_SPINLOCKS)
+typedef volatile unsigned long spinlock_t;
+#elif defined(INTEL_SPINLOCKS)
+typedef volatile int spinlock_t;
+#elif defined(MIPS_SPINLOCKS)
+typedef volatile unsigned long spinlock_t;
+#else
+#error Need to implement spinlock code in spinlock.h
+#endif
+
+typedef struct {
+ spinlock_t lock;
+ volatile int count;
+} rwlock_t;
+
+int tdb_spinlock(TDB_CONTEXT *tdb, int list, int rw_type);
+int tdb_spinunlock(TDB_CONTEXT *tdb, int list, int rw_type);
+int tdb_create_rwlocks(int fd, unsigned int hash_size);
+int tdb_clear_spinlocks(TDB_CONTEXT *tdb);
+
+#else /* !USE_SPINLOCKS */
+#if 0
+#define tdb_create_rwlocks(fd, hash_size) 0
+#define tdb_spinlock(tdb, list, rw_type) (-1)
+#define tdb_spinunlock(tdb, list, rw_type) (-1)
+#else
+int tdb_spinlock(TDB_CONTEXT *tdb, int list, int rw_type);
+int tdb_spinunlock(TDB_CONTEXT *tdb, int list, int rw_type);
+int tdb_create_rwlocks(int fd, unsigned int hash_size);
+#endif
+int tdb_clear_spinlocks(TDB_CONTEXT *tdb);
+#endif
+
+#endif