Add spinlock wrapper helpers
authorJens Axboe <jens.axboe@oracle.com>
Thu, 12 Jun 2008 09:49:46 +0000 (11:49 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Thu, 12 Jun 2008 09:49:46 +0000 (11:49 +0200)
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Makefile
Makefile.FreeBSD
Makefile.solaris
spinlock.c [new file with mode: 0644]
spinlock.h [new file with mode: 0644]

index 11bb17e7387b3b1bf54d36fc455596370d4a4a4e..f05580a6b3106d32ad0543a8d51a7433ef402617 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ CFLAGS  = -Wwrite-strings -Wall -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_
 PROGS  = fio
 SCRIPTS = fio_generate_plots
 OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
 PROGS  = fio
 SCRIPTS = fio_generate_plots
 OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
-       eta.o verify.o memory.o io_u.o parse.o mutex.o options.o \
+       eta.o verify.o memory.o io_u.o parse.o mutex.o spinlock.o options.o \
        rbtree.o diskutil.o fifo.o blktrace.o smalloc.o filehash.o
 
 OBJS += crc/crc7.o
        rbtree.o diskutil.o fifo.o blktrace.o smalloc.o filehash.o
 
 OBJS += crc/crc7.o
index 6b41db156c3444e057def9ef65b3e31e8b7c2812..82b4931d1e8a65cb88640ed03ff4e205eb1a989b 100644 (file)
@@ -5,7 +5,7 @@ CFLAGS  = -Wwrite-strings -Wall -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_
 PROGS  = fio
 SCRIPTS = fio_generate_plots
 OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
 PROGS  = fio
 SCRIPTS = fio_generate_plots
 OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
-       eta.o verify.o memory.o io_u.o parse.o mutex.o options.o \
+       eta.o verify.o memory.o io_u.o parse.o mutex.o spinlock.o options.o \
        rbtree.o smalloc.o filehash.o
 
 OBJS += crc/crc7.o
        rbtree.o smalloc.o filehash.o
 
 OBJS += crc/crc7.o
index fd1029bc5f38b2e518c6dde55db375b79d0bdfb2..b8e75f81f62f1806c430ab2f5003766d50eb62d9 100644 (file)
@@ -3,7 +3,7 @@ CFLAGS  = -Wall -O2 -g -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -
 PROGS  = fio
 SCRIPTS = fio_generate_plots
 OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
 PROGS  = fio
 SCRIPTS = fio_generate_plots
 OBJS = gettime.o fio.o ioengines.o init.o stat.o log.o time.o filesetup.o \
-       eta.o verify.o memory.o io_u.o parse.o mutex.o options.o \
+       eta.o verify.o memory.o io_u.o parse.o mutex.o spinlock.o options.o \
        rbtree.o fifo.o smalloc.o filehash.o lib/strsep.o
 
 OBJS += crc/crc7.o
        rbtree.o fifo.o smalloc.o filehash.o lib/strsep.o
 
 OBJS += crc/crc7.o
diff --git a/spinlock.c b/spinlock.c
new file mode 100644 (file)
index 0000000..38b4ddd
--- /dev/null
@@ -0,0 +1,55 @@
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <sys/mman.h>
+
+#include "arch/arch.h"
+#include "spinlock.h"
+
+void fio_spinlock_remove(struct fio_spinlock *lock)
+{
+       close(lock->lock_fd);
+       munmap((void *) lock, sizeof(*lock));
+}
+
+struct fio_spinlock *fio_spinlock_init(void)
+{
+       char spinlock_name[] = "/tmp/.fio_spinlock.XXXXXX";
+       struct fio_spinlock *lock = NULL;
+       int fd;
+
+       fd = mkstemp(spinlock_name);
+       if (fd < 0) {
+               perror("open spinlock");
+               return NULL;
+       }
+
+       if (ftruncate(fd, sizeof(struct fio_spinlock)) < 0) {
+               perror("ftruncate spinlock");
+               goto err;
+       }
+
+       lock = (void *) mmap(NULL, sizeof(struct fio_spinlock),
+                               PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+       if (lock == MAP_FAILED) {
+               perror("mmap spinlock");
+               close(fd);
+               lock = NULL;
+               goto err;
+       }
+
+       unlink(spinlock_name);
+       lock->lock_fd = fd;
+       spin_lock_init(&lock->slock);
+
+       return lock;
+err:
+       if (lock)
+               fio_spinlock_remove(lock);
+
+       unlink(spinlock_name);
+       return NULL;
+}
diff --git a/spinlock.h b/spinlock.h
new file mode 100644 (file)
index 0000000..ebc06b3
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef FIO_SPINLOCK_H
+#define FIO_SPINLOCK_H
+
+struct fio_spinlock {
+       spinlock_t slock;
+       int lock_fd;
+};
+
+extern struct fio_spinlock *fio_spinlock_init(void);
+extern void fio_spinlock_remove(struct fio_spinlock *);
+
+static inline void fio_spin_lock(struct fio_spinlock *lock)
+{
+       spin_lock(&lock->slock);
+}
+
+static inline void fio_spin_unlock(struct fio_spinlock *lock)
+{
+       spin_unlock(&lock->slock);
+}
+
+#endif