lock.h
1.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//
// lock.h
// BBAAPIRequest
//
// Created by cairui01 on 2020/05/11.
//
#ifndef LOCK_H_
#define LOCK_H_
#include <unistd.h>
#include "mutex.h"
#include "spinlock.h"
#include "time_utils.h"
template <typename MutexType>
class BaseScopedLock {
public:
explicit BaseScopedLock(MutexType& mutex, bool initiallyLocked = true)
: mutex_(mutex) , islocked_(false) {
if (!initiallyLocked) return;
lock();
}
explicit BaseScopedLock(MutexType& mutex, long _millisecond)
: mutex_(mutex) , islocked_(false) {
timedlock(_millisecond);
}
~BaseScopedLock() {
if (islocked_) unlock();
}
bool islocked() const {
return islocked_;
}
void lock() {
if (!islocked_ && mutex_.lock()) {
islocked_ = true;
}
}
void unlock() {
if (islocked_) {
mutex_.unlock();
islocked_ = false;
}
}
bool trylock() {
if (islocked_) return false;
islocked_ = mutex_.trylock();
return islocked_;
}
#ifdef __linux__
bool timedlock(long _millisecond) {
if (islocked_) return true;
islocked_ = mutex_.timedlock(_millisecond);
return islocked_;
}
#else
bool timedlock(long _millisecond) {
if (islocked_) return true;
unsigned long start = gettickcount();
unsigned long cur = start;
while (cur <= start + _millisecond) {
if (trylock()) break;
usleep(50 * 1000);
cur = gettickcount();
}
return islocked_;
}
#endif
MutexType& internal() {
return mutex_;
}
private:
MutexType& mutex_;
bool islocked_;
};
typedef BaseScopedLock<Mutex> ScopedLock;
typedef BaseScopedLock<SpinLock> ScopedSpinLock;
#endif