blob: 5a4f3c30a27e933e0c07044ff99afd75721b03a0 [file] [log] [blame]
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +08001#include "dvr_types.h"
2#include "dvr_mutex.h"
3
4#define merr(f,...) DVR_DEBUG_FL(1, "dvr_mutex", f, ##__VA_ARGS__)
5#define mdbg(f,...) merr(f, ##__VA_ARGS__)
6
7void _dvr_mutex_init(void *mutex)
8{
9 if (!mutex) {
10 merr("null mutex\n");
11 return;
12 }
13 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
14 memset(mtx, 0, sizeof(dvr_mutex_t));
15 if (pthread_mutex_init(&mtx->lock, NULL) != 0) {
16 merr("init mutex fail\n");
17 return;
18 }
19 mtx->thread = 0;
20 mtx->lock_cnt = 0;
21 return;
22}
23
24void _dvr_mutex_lock(void *mutex)
25{
26 if (!mutex) {
27 merr("null mutex\n");
28 return;
29 }
30 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
31 if (pthread_equal(mtx->thread, pthread_self()) != 0) {
Zhiqiang Han7e771452022-06-15 22:22:39 +080032 mtx->lock_cnt++;
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080033 } else {
34 pthread_mutex_lock(&mtx->lock);
35 mtx->thread = pthread_self();
36 mtx->lock_cnt = 1;
37 }
38}
39
40void _dvr_mutex_unlock(void *mutex)
41{
42 if (!mutex) {
43 merr("null mutex\n");
44 return;
45 }
46 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
47 if (pthread_equal(mtx->thread, pthread_self()) != 0) {
Zhiqiang Han7e771452022-06-15 22:22:39 +080048 mtx->lock_cnt--;
49 if (mtx->lock_cnt == 0) {
Zhiqiang Hanf9c0e272022-06-14 13:54:03 +080050 mtx->thread = 0;
51 pthread_mutex_unlock(&mtx->lock);
52 }
53 } else {
54 mdbg("not own mutex\n");
55 }
56}
57
58void _dvr_mutex_destroy(void *mutex)
59{
60 if (!mutex) {
61 merr("null mutex\n");
62 return;
63 }
64 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
65 pthread_mutex_destroy(mtx);
66}
67
68int _dvr_mutex_save(void *mutex)
69{
70 if (!mutex) {
71 merr("null mutex\n");
72 return 0;
73 }
74 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
75 int cnt = mtx->lock_cnt;
76 mtx->lock_cnt = 0;
77 mtx->thread = 0;
78 return cnt;
79}
80
81void _dvr_mutex_restore(void *mutex, int val)
82{
83 if (!mutex) {
84 merr("null mutex\n");
85 return;
86 }
87 dvr_mutex_t *mtx = (dvr_mutex_t*)mutex;
88 mtx->lock_cnt = val;
89 mtx->thread = pthread_self();
90}
91
92#ifdef DVR_MUTEX_DEBUG
93void _dvr_mutex_init_dbg(void *mutex, const char *file, int line)
94{
95 mdbg("%s:%d\n", file, line);
96 _dvr_mutex_init(mutex);
97}
98void _dvr_mutex_lock_dbg(void *mutex, const char *file, int line)
99{
100 mdbg("%s:%d\n", file, line);
101 _dvr_mutex_lock(mutex);
102}
103void _dvr_mutex_unlock_dbg(void *mutex, const char *file, int line)
104{
105 mdbg("%s:%d\n", file, line);
106 _dvr_mutex_unlock(mutex);
107}
108void _dvr_mutex_destroy_dbg(void *mutex, const char *file, int line)
109{
110 mdbg("%s:%d\n", file, line);
111 _dvr_mutex_destroy(mutex);
112}
113int _dvr_mutex_save_dbg(void *mutex, const char *file, int line)
114{
115 mdbg("%s:%d\n", file, line);
116 return _dvr_mutex_save(mutex);
117}
118void _dvr_mutex_restore_dbg(void *mutex, int val, const char *file, int line)
119{
120 mdbg("%s:%d\n", file, line);
121 _dvr_mutex_restore(mutex, val);
122}
123#endif
124