/* SPDX-License-Identifier: GPL-2.0 */ 
 | 
#ifndef _LIBLOCKDEP_MUTEX_H 
 | 
#define _LIBLOCKDEP_MUTEX_H 
 | 
  
 | 
#include <pthread.h> 
 | 
#include "common.h" 
 | 
  
 | 
struct liblockdep_pthread_mutex { 
 | 
    pthread_mutex_t mutex; 
 | 
    struct lock_class_key key; 
 | 
    struct lockdep_map dep_map; 
 | 
}; 
 | 
  
 | 
typedef struct liblockdep_pthread_mutex liblockdep_pthread_mutex_t; 
 | 
  
 | 
#define LIBLOCKDEP_PTHREAD_MUTEX_INITIALIZER(mtx)            \ 
 | 
        (const struct liblockdep_pthread_mutex) {        \ 
 | 
    .mutex = PTHREAD_MUTEX_INITIALIZER,                \ 
 | 
    .dep_map = STATIC_LOCKDEP_MAP_INIT(#mtx, &((&(mtx))->dep_map)),    \ 
 | 
} 
 | 
  
 | 
static inline int __mutex_init(liblockdep_pthread_mutex_t *lock, 
 | 
                const char *name, 
 | 
                struct lock_class_key *key, 
 | 
                const pthread_mutexattr_t *__mutexattr) 
 | 
{ 
 | 
    lockdep_init_map(&lock->dep_map, name, key, 0); 
 | 
    return pthread_mutex_init(&lock->mutex, __mutexattr); 
 | 
} 
 | 
  
 | 
#define liblockdep_pthread_mutex_init(mutex, mutexattr)            \ 
 | 
({                                    \ 
 | 
    lockdep_register_key(&(mutex)->key);                \ 
 | 
    __mutex_init((mutex), #mutex, &(mutex)->key, (mutexattr));    \ 
 | 
}) 
 | 
  
 | 
static inline int liblockdep_pthread_mutex_lock(liblockdep_pthread_mutex_t *lock) 
 | 
{ 
 | 
    lock_acquire(&lock->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); 
 | 
    return pthread_mutex_lock(&lock->mutex); 
 | 
} 
 | 
  
 | 
static inline int liblockdep_pthread_mutex_unlock(liblockdep_pthread_mutex_t *lock) 
 | 
{ 
 | 
    lock_release(&lock->dep_map, (unsigned long)_RET_IP_); 
 | 
    return pthread_mutex_unlock(&lock->mutex); 
 | 
} 
 | 
  
 | 
static inline int liblockdep_pthread_mutex_trylock(liblockdep_pthread_mutex_t *lock) 
 | 
{ 
 | 
    lock_acquire(&lock->dep_map, 0, 1, 0, 1, NULL, (unsigned long)_RET_IP_); 
 | 
    return pthread_mutex_trylock(&lock->mutex) == 0 ? 1 : 0; 
 | 
} 
 | 
  
 | 
static inline int liblockdep_pthread_mutex_destroy(liblockdep_pthread_mutex_t *lock) 
 | 
{ 
 | 
    lockdep_reset_lock(&lock->dep_map); 
 | 
    lockdep_unregister_key(&lock->key); 
 | 
    return pthread_mutex_destroy(&lock->mutex); 
 | 
} 
 | 
  
 | 
#ifdef __USE_LIBLOCKDEP 
 | 
  
 | 
#define pthread_mutex_t         liblockdep_pthread_mutex_t 
 | 
#define pthread_mutex_init      liblockdep_pthread_mutex_init 
 | 
#define pthread_mutex_lock      liblockdep_pthread_mutex_lock 
 | 
#define pthread_mutex_unlock    liblockdep_pthread_mutex_unlock 
 | 
#define pthread_mutex_trylock   liblockdep_pthread_mutex_trylock 
 | 
#define pthread_mutex_destroy   liblockdep_pthread_mutex_destroy 
 | 
  
 | 
#endif 
 | 
  
 | 
#endif 
 |