lkml.org 
[lkml]   [2013]   [Feb]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 4/7] liblockdep: public headers for rwlock implementation
    Date
    Both pthreads and lockdep support dealing with rwlocks, so here's the
    liblockdep implementation for those.

    Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
    ---
    tools/lib/lockdep/include/liblockdep/rwlock.h | 91 +++++++++++++++++++++++++++
    1 file changed, 91 insertions(+)
    create mode 100644 tools/lib/lockdep/include/liblockdep/rwlock.h

    diff --git a/tools/lib/lockdep/include/liblockdep/rwlock.h b/tools/lib/lockdep/include/liblockdep/rwlock.h
    new file mode 100644
    index 0000000..26f9a68
    --- /dev/null
    +++ b/tools/lib/lockdep/include/liblockdep/rwlock.h
    @@ -0,0 +1,91 @@
    +#ifndef _LIBLOCKDEP_RWLOCK_H
    +#define _LIBLOCKDEP_RWLOCK_H
    +
    +#ifdef __USE_LIBLOCKDEP
    +
    +#include <pthread.h>
    +#include "common.h"
    +
    +struct liblockdep_pthread_rwlock {
    + pthread_rwlock_t rwlock;
    + struct lockdep_map dep_map;
    +};
    +
    +typedef struct liblockdep_pthread_rwlock liblockdep_pthread_rwlock_t;
    +
    +#define LIBLOCKDEP_PTHREAD_RWLOCK_INITIALIZER(rwl) \
    + (struct liblockdep_pthread_rwlock) { \
    + .rwlock = PTHREAD_RWLOCK_INITIALIZER, \
    + .dep_map = STATIC_LOCKDEP_MAP_INIT(#rwl, &((&(rwl))->dep_map)), \
    +}
    +
    +static inline int __rwlock_init(liblockdep_pthread_rwlock_t *lock,
    + const char *name,
    + struct lock_class_key *key,
    + const pthread_rwlockattr_t *attr)
    +{
    + lockdep_init_map(&lock->dep_map, name, key, 0);
    +
    + return pthread_rwlock_init(&lock->rwlock, attr);
    +}
    +
    +#define liblockdep_pthread_rwlock_init(lock, attr) \
    +({ \
    + static struct lock_class_key __key; \
    + \
    + __rwlock_init((lock), #lock, &__key, (attr)); \
    +})
    +
    +static inline int liblockdep_pthread_rwlock_rdlock(liblockdep_pthread_rwlock_t *lock)
    +{
    + void *ip = _THIS_IP_;
    + lock_acquire(&lock->dep_map, 0, 0, 2, 2, NULL, (unsigned long)ip);
    + return pthread_rwlock_rdlock(&lock->rwlock);
    +
    +}
    +
    +static inline int liblockdep_pthread_rwlock_unlock(liblockdep_pthread_rwlock_t *lock)
    +{
    + void *ip = _THIS_IP_;
    + lock_release(&lock->dep_map, 0, (unsigned long)ip);
    + return pthread_rwlock_unlock(&lock->rwlock);
    +}
    +
    +static inline int liblockdep_pthread_rwlock_wrlock(liblockdep_pthread_rwlock_t *lock)
    +{
    + void *ip = _THIS_IP_;
    + lock_acquire(&lock->dep_map, 0, 0, 0, 2, NULL, (unsigned long)ip);
    + return pthread_rwlock_wrlock(&lock->rwlock);
    +}
    +
    +static inline int liblockdep_pthread_rwlock_tryrdlock(liblockdep_pthread_rwlock_t *lock)
    +{
    + void *ip = _THIS_IP_;
    + lock_acquire(&lock->dep_map, 0, 1, 2, 2, NULL, (unsigned long)ip);
    + return pthread_rwlock_tryrdlock(&lock->rwlock) == 0 ? 1 : 0;
    +}
    +
    +static inline int liblockdep_pthread_rwlock_trywlock(liblockdep_pthread_rwlock_t *lock)
    +{
    + void *ip = _THIS_IP_;
    + lock_acquire(&lock->dep_map, 0, 1, 0, 2, NULL, (unsigned long)ip);
    + return pthread_rwlock_trywlock(&lock->rwlock) == 0 ? 1 : 0;
    +}
    +
    +static inline int liblockdep_rwlock_destroy(liblockdep_pthread_rwlock_t *lock)
    +{
    + return pthread_rwlock_destroy(&lock->rwlock);
    +}
    +
    +#define pthread_rwlock_t liblockdep_pthread_rwlock_t
    +#define pthread_rwlock_init liblockdep_pthread_rwlock_init
    +#define pthread_rwlock_rdlock liblockdep_pthread_rwlock_rdlock
    +#define pthread_rwlock_unlock liblockdep_pthread_rwlock_unlock
    +#define pthread_rwlock_wrlock liblockdep_pthread_rwlock_wrlock
    +#define pthread_rwlock_tryrdlock liblockdep_pthread_rwlock_tryrdlock
    +#define pthread_rwlock_trywlock liblockdep_pthread_rwlock_trywlock
    +#define pthread_rwlock_destroy liblockdep_rwlock_destroy
    +
    +#endif
    +
    +#endif
    --
    1.8.1.2


    \
     
     \ /
      Last update: 2013-02-04 03:21    [W:2.572 / U:0.280 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site