blob: 42cd788d69acbe66b43ec471d176195bfea33291 (
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
|
#include "base/deferred_task.hpp"
namespace base
{
DeferredTask::DeferredTask(Duration const & duration) : m_duration(duration)
{
m_thread = threads::SimpleThread([this]
{
std::unique_lock<std::mutex> l(m_mutex);
while (!m_terminate)
{
if (!m_fn)
{
m_cv.wait(l);
continue;
}
if (m_cv.wait_for(l, m_duration) != std::cv_status::timeout || !m_fn)
continue;
auto fn = move(m_fn);
m_fn = nullptr;
l.unlock();
fn();
l.lock();
}
});
}
DeferredTask::~DeferredTask()
{
{
std::unique_lock<std::mutex> l(m_mutex);
m_terminate = true;
}
m_cv.notify_one();
m_thread.join();
}
void DeferredTask::Drop()
{
{
std::unique_lock<std::mutex> l(m_mutex);
m_fn = nullptr;
}
m_cv.notify_one();
}
} // namespace base
|