blob: 1dd4fb053187001431e1ba5336860509b72b1fe6 [file] [log] [blame]
Zhiqiang Han692ef342022-06-17 15:29:03 +08001#include <string.h>
2
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +08003#include "dvr_types.h"
4#include "dvr_mutex.h"
5
Wentao MA96f68962022-06-15 19:45:35 +08006#define MUTEX_LOG_TAG "libdvr-mutex"
Wentao MAe8ba5172022-08-09 11:18:17 +08007#define mutex_error(...) DVR_LOG_PRINT(LOG_LV_ERROR, MUTEX_LOG_TAG, __VA_ARGS__)
8#define mutex_debug(...) DVR_LOG_PRINT(LOG_LV_DEBUG, MUTEX_LOG_TAG, __VA_ARGS__)
Wentao MA96f68962022-06-15 19:45:35 +08009
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080010
11void _dvr_mutex_init(void *mutex)
12{
13 if (!mutex) {
Wentao MAe8ba5172022-08-09 11:18:17 +080014 mutex_error("null mutex\n");
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080015 return;
16 }
17 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
18 memset(mtx, 0, sizeof(dvr_mutex_t));
19 if (pthread_mutex_init(&mtx->lock, NULL) != 0) {
Wentao MAe8ba5172022-08-09 11:18:17 +080020 mutex_error("init mutex fail\n");
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080021 return;
22 }
23 mtx->thread = 0;
24 mtx->lock_cnt = 0;
25 return;
26}
27
28void _dvr_mutex_lock(void *mutex)
29{
30 if (!mutex) {
Wentao MAe8ba5172022-08-09 11:18:17 +080031 mutex_error("null mutex\n");
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080032 return;
33 }
34 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
35 if (pthread_equal(mtx->thread, pthread_self()) != 0) {
Zhiqiang Han7e771452022-06-15 22:22:39 +080036 mtx->lock_cnt++;
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080037 } else {
38 pthread_mutex_lock(&mtx->lock);
39 mtx->thread = pthread_self();
40 mtx->lock_cnt = 1;
41 }
42}
43
44void _dvr_mutex_unlock(void *mutex)
45{
46 if (!mutex) {
Wentao MAe8ba5172022-08-09 11:18:17 +080047 mutex_error("null mutex\n");
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080048 return;
49 }
50 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
51 if (pthread_equal(mtx->thread, pthread_self()) != 0) {
Zhiqiang Han7e771452022-06-15 22:22:39 +080052 mtx->lock_cnt--;
53 if (mtx->lock_cnt == 0) {
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080054 mtx->thread = 0;
55 pthread_mutex_unlock(&mtx->lock);
56 }
57 } else {
Wentao MAe8ba5172022-08-09 11:18:17 +080058 mutex_debug("not own mutex\n");
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080059 }
60}
61
62void _dvr_mutex_destroy(void *mutex)
63{
64 if (!mutex) {
Wentao MAe8ba5172022-08-09 11:18:17 +080065 mutex_error("null mutex\n");
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080066 return;
67 }
68 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
Zhiqiang Han692ef342022-06-17 15:29:03 +080069 pthread_mutex_destroy(&mtx->lock);
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080070}
71
72int _dvr_mutex_save(void *mutex)
73{
74 if (!mutex) {
Wentao MAe8ba5172022-08-09 11:18:17 +080075 mutex_error("null mutex\n");
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080076 return 0;
77 }
78 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
79 int cnt = mtx->lock_cnt;
80 mtx->lock_cnt = 0;
81 mtx->thread = 0;
82 return cnt;
83}
84
85void _dvr_mutex_restore(void *mutex, int val)
86{
87 if (!mutex) {
Wentao MAe8ba5172022-08-09 11:18:17 +080088 mutex_error("null mutex\n");
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080089 return;
90 }
91 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
92 mtx->lock_cnt = val;
93 mtx->thread = pthread_self();
94}
95
96#ifdef DVR_MUTEX_DEBUG
97void _dvr_mutex_init_dbg(void *mutex, const char *file, int line)
98{
Wentao MAe8ba5172022-08-09 11:18:17 +080099 mutex_debug("%s:%d\n", file, line);
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +0800100 _dvr_mutex_init(mutex);
101}
102void _dvr_mutex_lock_dbg(void *mutex, const char *file, int line)
103{
Wentao MAe8ba5172022-08-09 11:18:17 +0800104 mutex_debug("%s:%d\n", file, line);
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +0800105 _dvr_mutex_lock(mutex);
106}
107void _dvr_mutex_unlock_dbg(void *mutex, const char *file, int line)
108{
Wentao MAe8ba5172022-08-09 11:18:17 +0800109 mutex_debug("%s:%d\n", file, line);
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +0800110 _dvr_mutex_unlock(mutex);
111}
112void _dvr_mutex_destroy_dbg(void *mutex, const char *file, int line)
113{
Wentao MAe8ba5172022-08-09 11:18:17 +0800114 mutex_debug("%s:%d\n", file, line);
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +0800115 _dvr_mutex_destroy(mutex);
116}
117int _dvr_mutex_save_dbg(void *mutex, const char *file, int line)
118{
Wentao MAe8ba5172022-08-09 11:18:17 +0800119 mutex_debug("%s:%d\n", file, line);
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +0800120 return _dvr_mutex_save(mutex);
121}
122void _dvr_mutex_restore_dbg(void *mutex, int val, const char *file, int line)
123{
Wentao MAe8ba5172022-08-09 11:18:17 +0800124 mutex_debug("%s:%d\n", file, line);
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +0800125 _dvr_mutex_restore(mutex, val);
126}
127#endif
128