blob: dce371d3b25b0ba4e8b8540d192bb463df69fb7b (
plain)
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
|
/*
* Copyright (C) 2005-2018 Team Kodi
* This file is part of Kodi - https://kodi.tv
*
* SPDX-License-Identifier: GPL-2.0-or-later
* See LICENSES/README.md for more information.
*/
#pragma once
#include "threads/Condition.h"
#include <mutex>
#include <shared_mutex>
/**
* A CSharedSection is a mutex that satisfies the Shared Lockable concept (see Lockables.h).
*/
class CSharedSection
{
CCriticalSection sec;
XbmcThreads::ConditionVariable actualCv;
unsigned int sharedCount = 0;
public:
inline CSharedSection() = default;
inline void lock()
{
std::unique_lock<CCriticalSection> l(sec);
while (sharedCount)
actualCv.wait(l, [this]() { return sharedCount == 0; });
sec.lock();
}
inline bool try_lock() { return (sec.try_lock() ? ((sharedCount == 0) ? true : (sec.unlock(), false)) : false); }
inline void unlock() { sec.unlock(); }
inline void lock_shared()
{
std::unique_lock<CCriticalSection> l(sec);
sharedCount++;
}
inline bool try_lock_shared() { return (sec.try_lock() ? sharedCount++, sec.unlock(), true : false); }
inline void unlock_shared()
{
std::unique_lock<CCriticalSection> l(sec);
sharedCount--;
if (!sharedCount)
{
actualCv.notifyAll();
}
}
};
|