2007-06-11 21:36:57 +00:00
|
|
|
#include <stasis/common.h>
|
2011-06-13 11:26:25 +00:00
|
|
|
#include <stasis/util/latchStats.h>
|
2004-07-06 01:22:18 +00:00
|
|
|
|
2004-07-14 20:49:18 +00:00
|
|
|
#ifndef __LATCHES_H
|
|
|
|
#define __LATCHES_H
|
|
|
|
|
2004-07-06 01:22:18 +00:00
|
|
|
/**
|
|
|
|
A data structure for profiling latching behavior.
|
|
|
|
All time values recorded in this struct are in microseconds.
|
|
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
const char * file;
|
|
|
|
int line;
|
|
|
|
const char * name;
|
|
|
|
pthread_mutex_t mutex;
|
|
|
|
profile_tuple tup;
|
|
|
|
char * last_acquired_at;
|
|
|
|
/* pblHashTable_t * lockpoints; */
|
|
|
|
void * lockpoints;
|
|
|
|
} lladd_pthread_mutex_t;
|
|
|
|
|
2011-06-13 11:26:25 +00:00
|
|
|
#include "rw.h"
|
2004-07-06 01:22:18 +00:00
|
|
|
|
|
|
|
/**
|
2009-10-13 00:29:35 +00:00
|
|
|
Keeps some profiling information along with a read/write lock.
|
2004-07-06 01:22:18 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
const char * file;
|
|
|
|
int line;
|
|
|
|
rwl * lock;
|
|
|
|
profile_tuple tup;
|
|
|
|
char * last_acquired_at;
|
|
|
|
/* pblHashTable_t * lockpoints; */
|
|
|
|
void * lockpoints;
|
2006-08-04 23:45:27 +00:00
|
|
|
pthread_t holder;
|
|
|
|
int readCount;
|
2004-07-06 01:22:18 +00:00
|
|
|
} __profile_rwl;
|
|
|
|
|
|
|
|
#ifdef PROFILE_LATCHES
|
|
|
|
|
2006-07-25 01:02:27 +00:00
|
|
|
/*#define pthread_mutex_t lladd_pthread_mutex_t
|
2004-07-06 01:22:18 +00:00
|
|
|
|
|
|
|
#define pthread_mutex_init(x, y) __lladd_pthread_mutex_init((x), (y), __FILE__, __LINE__, #x)
|
|
|
|
#define pthread_mutex_destroy(x) __lladd_pthread_mutex_destroy((x))
|
|
|
|
#define pthread_mutex_lock(x) __lladd_pthread_mutex_lock((x), __FILE__, __LINE__)
|
|
|
|
#define pthread_mutex_unlock(x) __lladd_pthread_mutex_unlock((x))
|
|
|
|
#define pthread_mutex_trylock(x) NO_PROFILING_EQUIVALENT_TO_PTHREAD_TRYLOCK
|
2006-07-25 01:02:27 +00:00
|
|
|
#define pthread_cond_wait(x, y) __lladd_pthread_cond_wait((x), (y), __FILE__, __LINE__, #x, #y)
|
|
|
|
#define pthread_cond_timedwait(x, y, z) __lladd_pthread_cond_timedwait((x), (y), (z), __FILE__, __LINE__, #x, #y)
|
2004-07-06 01:22:18 +00:00
|
|
|
|
|
|
|
int __lladd_pthread_mutex_init(lladd_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr, const char * file, int line, const char * mutex_name);
|
|
|
|
int __lladd_pthread_mutex_lock(lladd_pthread_mutex_t *mutex, char * file, int line);
|
|
|
|
int __lladd_pthread_mutex_unlock(lladd_pthread_mutex_t *mutex);
|
|
|
|
int __lladd_pthread_mutex_destroy(lladd_pthread_mutex_t *mutex);
|
2004-07-20 00:15:17 +00:00
|
|
|
int __lladd_pthread_cond_wait(pthread_cond_t *cond, lladd_pthread_mutex_t *mutex,
|
|
|
|
char * file, int line, char * cond_name, char * mutex_name);
|
2006-07-25 01:02:27 +00:00
|
|
|
// @param abstime should be const struct timespec, but GCC won't take that.
|
2004-07-20 00:15:17 +00:00
|
|
|
int __lladd_pthread_cond_timedwait(pthread_cond_t *cond, lladd_pthread_mutex_t *mutex, void *abstime,
|
|
|
|
char * file, int line, char * cond_name, char * mutex_name);
|
2006-07-25 01:02:27 +00:00
|
|
|
*/
|
2004-07-06 01:22:18 +00:00
|
|
|
#define initlock() __profile_rw_initlock(__FILE__, __LINE__)
|
|
|
|
#define readlock(x, y) __profile_readlock((x),(y), __FILE__, __LINE__)
|
|
|
|
#define writelock(x, y) __profile_writelock((x), (y), __FILE__, __LINE__)
|
|
|
|
#define readunlock(x) __profile_readunlock((x))
|
|
|
|
#define writeunlock(x) __profile_writeunlock((x))
|
2004-07-20 00:15:17 +00:00
|
|
|
#define unlock(x) __profile_unlock((x))
|
|
|
|
#define downgradelock(x) __profile_downgradelock((x))
|
2004-07-06 01:22:18 +00:00
|
|
|
#define deletelock(x) __profile_deletelock((x))
|
|
|
|
|
|
|
|
#define rwl __profile_rwl
|
|
|
|
|
|
|
|
rwl *__profile_rw_initlock (char * file, int line);
|
|
|
|
void __profile_readlock (rwl *lock, int d, char * file, int line);
|
|
|
|
void __profile_writelock (rwl *lock, int d, char * file, int line);
|
|
|
|
void __profile_readunlock (rwl *lock);
|
|
|
|
void __profile_writeunlock (rwl *lock);
|
2004-07-20 00:15:17 +00:00
|
|
|
void __profile_unlock (rwl *lock);
|
|
|
|
void __profile_downgradelock (rwl *lock);
|
2004-07-06 01:22:18 +00:00
|
|
|
void __profile_deletelock (rwl *lock);
|
|
|
|
|
|
|
|
|
2004-07-20 00:15:17 +00:00
|
|
|
|
|
|
|
|
2004-07-06 01:22:18 +00:00
|
|
|
#endif
|
|
|
|
|
2004-10-19 04:45:42 +00:00
|
|
|
#ifdef NO_LATCHES
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* #define pthread_mutex_init(x, y) */
|
|
|
|
/* #define pthread_mutex_destroy(x) */
|
|
|
|
#define pthread_mutex_lock(x) 1
|
|
|
|
#define pthread_mutex_unlock(x) 1
|
|
|
|
#define pthread_mutex_trylock(x) 1
|
|
|
|
#define pthread_cond_wait(x, y) 1
|
|
|
|
#define pthread_cond_timedwait(x, y, z) 1
|
|
|
|
|
|
|
|
/* #define initlock() */
|
|
|
|
#define readlock(x, y) 1
|
|
|
|
#define writelock(x, y) 1
|
|
|
|
#define readunlock(x) 1
|
|
|
|
#define writeunlock(x) 1
|
|
|
|
#define unlock(x) 1
|
|
|
|
#define downgradelock(x) 1
|
|
|
|
/* #define deletelock(x) */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2011-07-15 17:34:44 +00:00
|
|
|
#ifdef HAVE_GCC_ATOMICS
|
|
|
|
#define CAS(mutex,_a,_o,_n) __sync_bool_compare_and_swap(_a,_o,_n)
|
|
|
|
#define BARRIER() __sync_synchronize()
|
|
|
|
#define FETCH_AND_ADD(_o,_i) __sync_fetch_and_add(_o,_i)
|
|
|
|
#if ULONG_MAX <= 4294967295 // are we on a 32 bit machine?
|
|
|
|
#define ATOMIC_READ_64(mutex,_o) FETCH_AND_ADD(_o,0)
|
merge in changes from svn[r1572..r1601]
------------------------------------------------------------------------
r1601 | sears.russell@gmail.com | 2012-03-20 18:43:00 -0400 (Tue, 20
Mar 2012) | 1 line
commit bLSM bloom filter to stasis/util, which is where it really
belongs
------------------------------------------------------------------------
r1600 | sears.russell@gmail.com | 2012-03-04 01:58:38 -0500 (Sun, 04
Mar 2012) | 1 line
fix memory leak in skiplist unit test (now it is valgrind clean)
------------------------------------------------------------------------
r1599 | sears.russell@gmail.com | 2012-03-04 01:58:05 -0500 (Sun, 04
Mar 2012) | 1 line
fix typo in finalize type
------------------------------------------------------------------------
r1598 | sears.russell@gmail.com | 2012-03-04 00:59:59 -0500 (Sun, 04
Mar 2012) | 1 line
add comparator and finalizer parameters to skiplist constructor
------------------------------------------------------------------------
r1597 | sears.russell@gmail.com | 2012-03-03 18:23:16 -0500 (Sat, 03
Mar 2012) | 1 line
bugfixes for skiplist
------------------------------------------------------------------------
r1596 | sears.russell@gmail.com | 2012-03-02 15:05:07 -0500 (Fri, 02
Mar 2012) | 1 line
updated concurrentSkipList. Seeing strange crashes
------------------------------------------------------------------------
r1595 | sears.russell@gmail.com | 2012-03-01 16:51:59 -0500 (Thu, 01
Mar 2012) | 1 line
add progress reports
------------------------------------------------------------------------
r1594 | sears.russell@gmail.com | 2012-02-28 13:17:05 -0500 (Tue, 28
Feb 2012) | 1 line
experimental support for automatic logfile preallocation
------------------------------------------------------------------------
r1593 | sears.russell@gmail.com | 2012-02-28 12:10:01 -0500 (Tue, 28
Feb 2012) | 1 line
add histogram reporting to rawIOPS benchmark
------------------------------------------------------------------------
r1592 | sears.russell@gmail.com | 2012-02-24 16:31:36 -0500 (Fri, 24
Feb 2012) | 1 line
userspace raid 0 implementation
------------------------------------------------------------------------
r1591 | sears.russell@gmail.com | 2012-02-12 01:47:25 -0500 (Sun, 12
Feb 2012) | 1 line
add skiplist unit test, fix compile warnings
------------------------------------------------------------------------
r1590 | sears.russell@gmail.com | 2012-02-12 00:52:52 -0500 (Sun, 12
Feb 2012) | 1 line
fix compile error
------------------------------------------------------------------------
r1589 | sears.russell@gmail.com | 2012-02-12 00:50:21 -0500 (Sun, 12
Feb 2012) | 1 line
fix some bugs in hazard.h surrounding thread list management and
overruns of R under high contention
------------------------------------------------------------------------
r1588 | sears.russell@gmail.com | 2012-02-11 14:23:10 -0500 (Sat, 11
Feb 2012) | 1 line
add hazard pointer for get_lock. It was implicitly blowing away the
hazard pointer protecting y in the caller
------------------------------------------------------------------------
r1587 | sears.russell@gmail.com | 2012-02-10 18:51:25 -0500 (Fri, 10
Feb 2012) | 1 line
fix null pointer bug
------------------------------------------------------------------------
r1586 | sears.russell@gmail.com | 2012-02-10 18:03:39 -0500 (Fri, 10
Feb 2012) | 1 line
add simple refcounting scheme to concurrentSkipList. This solves the
problem where a deleted node points to another deleted node, and we
only have a hazard pointer for the first node.
------------------------------------------------------------------------
r1585 | sears.russell@gmail.com | 2012-02-10 14:19:14 -0500 (Fri, 10
Feb 2012) | 1 line
add hazard pointers for update using the smallest free slot first. The
old method left a race condition, since hazard_scan stops at the first
null pointer.
------------------------------------------------------------------------
r1584 | sears.russell@gmail.com | 2012-02-10 02:45:30 -0500 (Fri, 10
Feb 2012) | 1 line
add hazard pointers for update array
------------------------------------------------------------------------
r1583 | sears.russell@gmail.com | 2012-02-10 00:04:50 -0500 (Fri, 10
Feb 2012) | 1 line
skiplist update: concurrent, but broken
------------------------------------------------------------------------
r1582 | sears.russell@gmail.com | 2012-02-09 17:44:27 -0500 (Thu, 09
Feb 2012) | 1 line
skip list implementation. Not concurrent yet.
------------------------------------------------------------------------
r1581 | sears.russell@gmail.com | 2012-02-08 13:33:29 -0500 (Wed, 08
Feb 2012) | 1 line
Commit of a bunch of new, unused code: KISS random number generator,
Hazard Pointers, SUX latches (untested) and bit twiddling for
concurrent b-tree
------------------------------------------------------------------------
r1580 | sears.russell@gmail.com | 2012-01-17 19:17:37 -0500 (Tue, 17
Jan 2012) | 1 line
fix typo
------------------------------------------------------------------------
r1579 | sears.russell@gmail.com | 2012-01-11 18:33:31 -0500 (Wed, 11
Jan 2012) | 1 line
static build fixes for linux. hopefully these do not break macos...
------------------------------------------------------------------------
r1578 | sears.russell@gmail.com | 2012-01-09 19:13:34 -0500 (Mon, 09
Jan 2012) | 1 line
fix cmake under linux
------------------------------------------------------------------------
r1577 | sears.russell@gmail.com | 2012-01-09 18:37:15 -0500 (Mon, 09
Jan 2012) | 1 line
fix linux static binary compilation bugs
------------------------------------------------------------------------
r1576 | sears.russell | 2012-01-09 18:00:08 -0500 (Mon, 09 Jan 2012) |
1 line
port to macos x
------------------------------------------------------------------------
r1575 | sears.russell | 2012-01-09 17:39:43 -0500 (Mon, 09 Jan 2012) |
1 line
add missing _ from sync call name
------------------------------------------------------------------------
r1574 | sears.russell@gmail.com | 2012-01-09 14:26:31 -0500 (Mon, 09
Jan 2012) | 1 line
add -rt flag to static builds
------------------------------------------------------------------------
r1573 | sears.russell@gmail.com | 2011-12-20 23:38:29 -0500 (Tue, 20
Dec 2011) | 1 line
Simple makefile geared toward building libstasis.so and libstasis.a
(and nothing else)
------------------------------------------------------------------------
r1572 | sears.russell@gmail.com | 2011-12-20 22:37:54 -0500 (Tue, 20
Dec 2011) | 1 line
add some missing #include<config.h> lines
2012-04-21 16:52:31 +00:00
|
|
|
#define ATOMIC_WRITE_64(mutex,_o,_n) __sync_lock_test_and_set(_o,_n)
|
2011-07-15 17:34:44 +00:00
|
|
|
#else // this is a 33 or greater bit machine. Assume it's 64 bit, and that 64 bit writes are atomic.
|
|
|
|
#define ATOMIC_READ_64(mutex,_a) *_a
|
|
|
|
#define ATOMIC_WRITE_64(mutex,_a,_n) do {*_a=_n; } while (0)
|
|
|
|
#endif
|
2011-08-19 22:43:28 +00:00
|
|
|
#define ATOMIC_READ_32(mutex,_a) *_a
|
|
|
|
#define ATOMIC_WRITE_32(mutex,_a,_n) do {*_a=_n; } while (0)
|
2011-07-15 17:34:44 +00:00
|
|
|
#else
|
|
|
|
#define CAS(mutex,_a,_o,_n) GCC_ATOMICS_REQUIRED
|
|
|
|
#define BARRIER() GCC_ATOMICS_REQUIRED
|
|
|
|
#define FETCH_AND_ADD(_a,_i) GCC_ATOMICS_REQUIRED
|
|
|
|
#define ATOMIC_READ_64(mutex, _a) GCC_ATOMICS_REQUIRED
|
|
|
|
#define ATOMIC_WRITE_64(mutex,_a,_n) GCC_ATOMICS_REQUIRED
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2004-07-14 20:49:18 +00:00
|
|
|
#endif /* __LATCHES_H */
|