18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _LIBLOCKDEP_MUTEX_H 38c2ecf20Sopenharmony_ci#define _LIBLOCKDEP_MUTEX_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <pthread.h> 68c2ecf20Sopenharmony_ci#include "common.h" 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_cistruct liblockdep_pthread_mutex { 98c2ecf20Sopenharmony_ci pthread_mutex_t mutex; 108c2ecf20Sopenharmony_ci struct lock_class_key key; 118c2ecf20Sopenharmony_ci struct lockdep_map dep_map; 128c2ecf20Sopenharmony_ci}; 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_citypedef struct liblockdep_pthread_mutex liblockdep_pthread_mutex_t; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#define LIBLOCKDEP_PTHREAD_MUTEX_INITIALIZER(mtx) \ 178c2ecf20Sopenharmony_ci (const struct liblockdep_pthread_mutex) { \ 188c2ecf20Sopenharmony_ci .mutex = PTHREAD_MUTEX_INITIALIZER, \ 198c2ecf20Sopenharmony_ci .dep_map = STATIC_LOCKDEP_MAP_INIT(#mtx, &((&(mtx))->dep_map)), \ 208c2ecf20Sopenharmony_ci} 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistatic inline int __mutex_init(liblockdep_pthread_mutex_t *lock, 238c2ecf20Sopenharmony_ci const char *name, 248c2ecf20Sopenharmony_ci struct lock_class_key *key, 258c2ecf20Sopenharmony_ci const pthread_mutexattr_t *__mutexattr) 268c2ecf20Sopenharmony_ci{ 278c2ecf20Sopenharmony_ci lockdep_init_map(&lock->dep_map, name, key, 0); 288c2ecf20Sopenharmony_ci return pthread_mutex_init(&lock->mutex, __mutexattr); 298c2ecf20Sopenharmony_ci} 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#define liblockdep_pthread_mutex_init(mutex, mutexattr) \ 328c2ecf20Sopenharmony_ci({ \ 338c2ecf20Sopenharmony_ci lockdep_register_key(&(mutex)->key); \ 348c2ecf20Sopenharmony_ci __mutex_init((mutex), #mutex, &(mutex)->key, (mutexattr)); \ 358c2ecf20Sopenharmony_ci}) 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic inline int liblockdep_pthread_mutex_lock(liblockdep_pthread_mutex_t *lock) 388c2ecf20Sopenharmony_ci{ 398c2ecf20Sopenharmony_ci lock_acquire(&lock->dep_map, 0, 0, 0, 1, NULL, (unsigned long)_RET_IP_); 408c2ecf20Sopenharmony_ci return pthread_mutex_lock(&lock->mutex); 418c2ecf20Sopenharmony_ci} 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_cistatic inline int liblockdep_pthread_mutex_unlock(liblockdep_pthread_mutex_t *lock) 448c2ecf20Sopenharmony_ci{ 458c2ecf20Sopenharmony_ci lock_release(&lock->dep_map, (unsigned long)_RET_IP_); 468c2ecf20Sopenharmony_ci return pthread_mutex_unlock(&lock->mutex); 478c2ecf20Sopenharmony_ci} 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cistatic inline int liblockdep_pthread_mutex_trylock(liblockdep_pthread_mutex_t *lock) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci lock_acquire(&lock->dep_map, 0, 1, 0, 1, NULL, (unsigned long)_RET_IP_); 528c2ecf20Sopenharmony_ci return pthread_mutex_trylock(&lock->mutex) == 0 ? 1 : 0; 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cistatic inline int liblockdep_pthread_mutex_destroy(liblockdep_pthread_mutex_t *lock) 568c2ecf20Sopenharmony_ci{ 578c2ecf20Sopenharmony_ci lockdep_reset_lock(&lock->dep_map); 588c2ecf20Sopenharmony_ci lockdep_unregister_key(&lock->key); 598c2ecf20Sopenharmony_ci return pthread_mutex_destroy(&lock->mutex); 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci#ifdef __USE_LIBLOCKDEP 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci#define pthread_mutex_t liblockdep_pthread_mutex_t 658c2ecf20Sopenharmony_ci#define pthread_mutex_init liblockdep_pthread_mutex_init 668c2ecf20Sopenharmony_ci#define pthread_mutex_lock liblockdep_pthread_mutex_lock 678c2ecf20Sopenharmony_ci#define pthread_mutex_unlock liblockdep_pthread_mutex_unlock 688c2ecf20Sopenharmony_ci#define pthread_mutex_trylock liblockdep_pthread_mutex_trylock 698c2ecf20Sopenharmony_ci#define pthread_mutex_destroy liblockdep_pthread_mutex_destroy 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci#endif 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci#endif 74