threadinterrupt.cpp raw

   1  // Copyright (c) 2009-2010 Satoshi Nakamoto
   2  // Copyright (c) 2009-2022 The Limenka developers
   3  // Distributed under the MIT software license, see the accompanying
   4  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   5  
   6  #include <util/threadinterrupt.h>
   7  
   8  #include <sync.h>
   9  
  10  CThreadInterrupt::CThreadInterrupt() : flag(false) {}
  11  
  12  CThreadInterrupt::operator bool() const
  13  {
  14      return flag.load(std::memory_order_acquire);
  15  }
  16  
  17  void CThreadInterrupt::reset()
  18  {
  19      flag.store(false, std::memory_order_release);
  20  }
  21  
  22  void CThreadInterrupt::operator()()
  23  {
  24      {
  25          LOCK(mut);
  26          flag.store(true, std::memory_order_release);
  27      }
  28      cond.notify_all();
  29  }
  30  
  31  bool CThreadInterrupt::sleep_for(Clock::duration rel_time)
  32  {
  33      WAIT_LOCK(mut, lock);
  34      return !cond.wait_for(lock, rel_time, [this]() { return flag.load(std::memory_order_acquire); });
  35  }
  36