1#ifndef _LIBLOCKDEP_RWLOCK_H 2#define _LIBLOCKDEP_RWLOCK_H 3 4#include <pthread.h> 5#include "common.h" 6 7struct liblockdep_pthread_rwlock { 8 pthread_rwlock_t rwlock; 9 struct lockdep_map dep_map; 10}; 11 12typedef struct liblockdep_pthread_rwlock liblockdep_pthread_rwlock_t; 13 14#define LIBLOCKDEP_PTHREAD_RWLOCK_INITIALIZER(rwl) \ 15 (struct liblockdep_pthread_rwlock) { \ 16 .rwlock = PTHREAD_RWLOCK_INITIALIZER, \ 17 .dep_map = STATIC_LOCKDEP_MAP_INIT(#rwl, &((&(rwl))->dep_map)), \ 18} 19 20static inline int __rwlock_init(liblockdep_pthread_rwlock_t *lock, 21 const char *name, 22 struct lock_class_key *key, 23 const pthread_rwlockattr_t *attr) 24{ 25 lockdep_init_map(&lock->dep_map, name, key, 0); 26 27 return pthread_rwlock_init(&lock->rwlock, attr); 28} 29 30#define liblockdep_pthread_rwlock_init(lock, attr) \ 31({ \ 32 static struct lock_class_key __key; \ 33 \ 34 __rwlock_init((lock), #lock, &__key, (attr)); \ 35}) 36 37static inline int liblockdep_pthread_rwlock_rdlock(liblockdep_pthread_rwlock_t *lock) 38{ 39 lock_acquire(&lock->dep_map, 0, 0, 2, 1, NULL, (unsigned long)_RET_IP_); 40 return pthread_rwlock_rdlock(&lock->rwlock); 41 42} 43 44static inline int liblockdep_pthread_rwlock_unlock(liblockdep_pthread_rwlock_t *lock) 45{ 46 lock_release(&lock->dep_map, 0, (unsigned long)_RET_IP_); 47 return pthread_rwlock_unlock(&lock->rwlock); 48} 49 50static inline int liblockdep_pthread_rwlock_wrlock(liblockdep_pthread_rwlock_t *lock) 51{ 52 lock_acquire(&lock->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); 53 return pthread_rwlock_wrlock(&lock->rwlock); 54} 55 56static inline int liblockdep_pthread_rwlock_tryrdlock(liblockdep_pthread_rwlock_t *lock) 57{ 58 lock_acquire(&lock->dep_map, 0, 1, 2, 1, NULL, (unsigned long)_RET_IP_); 59 return pthread_rwlock_tryrdlock(&lock->rwlock) == 0 ? 1 : 0; 60} 61 62static inline int liblockdep_pthread_rwlock_trywlock(liblockdep_pthread_rwlock_t *lock) 63{ 64 lock_acquire(&lock->dep_map, 0, 1, 0, 1, NULL, (unsigned long)_RET_IP_); 65 return pthread_rwlock_trywlock(&lock->rwlock) == 0 ? 1 : 0; 66} 67 68static inline int liblockdep_rwlock_destroy(liblockdep_pthread_rwlock_t *lock) 69{ 70 return pthread_rwlock_destroy(&lock->rwlock); 71} 72 73#ifdef __USE_LIBLOCKDEP 74 75#define pthread_rwlock_t liblockdep_pthread_rwlock_t 76#define pthread_rwlock_init liblockdep_pthread_rwlock_init 77#define pthread_rwlock_rdlock liblockdep_pthread_rwlock_rdlock 78#define pthread_rwlock_unlock liblockdep_pthread_rwlock_unlock 79#define pthread_rwlock_wrlock liblockdep_pthread_rwlock_wrlock 80#define pthread_rwlock_tryrdlock liblockdep_pthread_rwlock_tryrdlock 81#define pthread_rwlock_trywlock liblockdep_pthread_rwlock_trywlock 82#define pthread_rwlock_destroy liblockdep_rwlock_destroy 83 84#endif 85 86#endif 87