blob: c7ea7e991097c1671ec83332cb42c9a53bb3727f [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"
7#define merr(...) DVR_LOG_PRINT(LOG_LV_ERROR, MUTEX_LOG_TAG, __VA_ARGS__)
8#define mdbg(...) DVR_LOG_PRINT(LOG_LV_DEBUG, MUTEX_LOG_TAG, __VA_ARGS__)
9
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080010
11void _dvr_mutex_init(void *mutex)
12{
13 if (!mutex) {
14 merr("null mutex\n");
15 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) {
20 merr("init mutex fail\n");
21 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) {
31 merr("null mutex\n");
32 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) {
47 merr("null mutex\n");
48 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 {
58 mdbg("not own mutex\n");
59 }
60}
61
62void _dvr_mutex_destroy(void *mutex)
63{
64 if (!mutex) {
65 merr("null mutex\n");
66 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) {
75 merr("null mutex\n");
76 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) {
88 merr("null mutex\n");
89 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{
99 mdbg("%s:%d\n", file, line);
100 _dvr_mutex_init(mutex);
101}
102void _dvr_mutex_lock_dbg(void *mutex, const char *file, int line)
103{
104 mdbg("%s:%d\n", file, line);
105 _dvr_mutex_lock(mutex);
106}
107void _dvr_mutex_unlock_dbg(void *mutex, const char *file, int line)
108{
109 mdbg("%s:%d\n", file, line);
110 _dvr_mutex_unlock(mutex);
111}
112void _dvr_mutex_destroy_dbg(void *mutex, const char *file, int line)
113{
114 mdbg("%s:%d\n", file, line);
115 _dvr_mutex_destroy(mutex);
116}
117int _dvr_mutex_save_dbg(void *mutex, const char *file, int line)
118{
119 mdbg("%s:%d\n", file, line);
120 return _dvr_mutex_save(mutex);
121}
122void _dvr_mutex_restore_dbg(void *mutex, int val, const char *file, int line)
123{
124 mdbg("%s:%d\n", file, line);
125 _dvr_mutex_restore(mutex, val);
126}
127#endif
128