Welcome to mirror list, hosted at ThFree Co, Russian Federation.

deferred_task.cpp « base - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b6d76e0029fc641c02bb14e79ff8d10e2b1fab18 (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 "deferred_task.hpp"

namespace my
{
DeferredTask::DeferredTask(TDuration const & duration) : m_duration(duration)
{
  m_thread = threads::SimpleThread([this]
  {
    unique_lock<mutex> l(m_mutex);
    while (!m_terminate)
    {
      if (!m_fn)
      {
        m_cv.wait(l);
        continue;
      }

      if (m_cv.wait_for(l, m_duration) != cv_status::timeout || !m_fn)
        continue;

      auto fn = move(m_fn);
      m_fn = nullptr;

      l.unlock();
      fn();
      l.lock();
    }
  });
}

DeferredTask::~DeferredTask()
{
  {
    unique_lock<mutex> l(m_mutex);
    m_terminate = true;
  }
  m_cv.notify_one();
  m_thread.join();
}

void DeferredTask::Drop()
{
  {
    unique_lock<mutex> l(m_mutex);
    m_fn = nullptr;
  }
  m_cv.notify_one();
}
}  // namespace my