2007-06-11 21:36:57 +00:00
|
|
|
#include <stasis/common.h>
|
2004-07-06 01:22:18 +00:00
|
|
|
#include <pthread.h>
|
2007-06-11 21:36:57 +00:00
|
|
|
#include <stasis/stats.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;
|
|
|
|
|
2008-11-07 03:44:41 +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
|
|
|
|
|
2004-07-14 20:49:18 +00:00
|
|
|
#endif /* __LATCHES_H */
|