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