1#ifndef _LIBLOCKDEP_MUTEX_H 2#define _LIBLOCKDEP_MUTEX_H 3 4#include <pthread.h> 5#include "common.h" 6 7struct liblockdep_pthread_mutex { 8 pthread_mutex_t mutex; 9 struct lockdep_map dep_map; 10}; 11 12typedef struct liblockdep_pthread_mutex liblockdep_pthread_mutex_t; 13 14#define LIBLOCKDEP_PTHREAD_MUTEX_INITIALIZER(mtx) \ 15 (const struct liblockdep_pthread_mutex) { \ 16 .mutex = PTHREAD_MUTEX_INITIALIZER, \ 17 .dep_map = STATIC_LOCKDEP_MAP_INIT(#mtx, &((&(mtx))->dep_map)), \ 18} 19 20static inline int __mutex_init(liblockdep_pthread_mutex_t *lock, 21 const char *name, 22 struct lock_class_key *key, 23 const pthread_mutexattr_t *__mutexattr) 24{ 25 lockdep_init_map(&lock->dep_map, name, key, 0); 26 return pthread_mutex_init(&lock->mutex, __mutexattr); 27} 28 29#define liblockdep_pthread_mutex_init(mutex, mutexattr) \ 30({ \ 31 static struct lock_class_key __key; \ 32 \ 33 __mutex_init((mutex), #mutex, &__key, (mutexattr)); \ 34}) 35 36static inline int liblockdep_pthread_mutex_lock(liblockdep_pthread_mutex_t *lock) 37{ 38 lock_acquire(&lock->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); 39 return pthread_mutex_lock(&lock->mutex); 40} 41 42static inline int liblockdep_pthread_mutex_unlock(liblockdep_pthread_mutex_t *lock) 43{ 44 lock_release(&lock->dep_map, 0, (unsigned long)_RET_IP_); 45 return pthread_mutex_unlock(&lock->mutex); 46} 47 48static inline int liblockdep_pthread_mutex_trylock(liblockdep_pthread_mutex_t *lock) 49{ 50 lock_acquire(&lock->dep_map, 0, 1, 0, 1, NULL, (unsigned long)_RET_IP_); 51 return pthread_mutex_trylock(&lock->mutex) == 0 ? 1 : 0; 52} 53 54static inline int liblockdep_pthread_mutex_destroy(liblockdep_pthread_mutex_t *lock) 55{ 56 return pthread_mutex_destroy(&lock->mutex); 57} 58 59#ifdef __USE_LIBLOCKDEP 60 61#define pthread_mutex_t liblockdep_pthread_mutex_t 62#define pthread_mutex_init liblockdep_pthread_mutex_init 63#define pthread_mutex_lock liblockdep_pthread_mutex_lock 64#define pthread_mutex_unlock liblockdep_pthread_mutex_unlock 65#define pthread_mutex_trylock liblockdep_pthread_mutex_trylock 66#define pthread_mutex_destroy liblockdep_pthread_mutex_destroy 67 68#endif 69 70#endif 71