linux/tools/lib/lockdep/include/liblockdep/rwlock.h
<<
>>
Prefs
   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