You usually implement recursive mutex as follows. It's much cheaper and
faster.
class RecursiveLock {
public:
RecursiveLock()
: owner_()
, recursion_() {
}
~RecursiveLock() {
}
void Acquire() {
Atomic32 me = PlatformThread::CurrentId();
if (me != NoBarrier_Load(&owner_) {
mtx_.Lock();
assert(recursion_ == 0);
assert(owner_ == 0);
NoBarrier_Store(&owner_, me);
}
recursion_++;
}
void Release() {
assert(&owner_ == PlatformThread::CurrentId());
assert(recursion_ > 0);
if (!--recursion_) {
NoBarrier_Store(&owner_, 0);
mtx_.Unlock();
}
}
private:
Lock mtx_;
Atomic32 owner_;
int recursion_;
};
You code looks correct as well. You do not need volatile for lock_count_,
it's
confusing.
https://codereview.chromium.org/11361057/