threadinterrupt.cpp raw

   1  // Copyright (c) 2009-2010 Satoshi Nakamoto
   2  // Copyright (c) 2009-present The Bitcoin Core 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  bool CThreadInterrupt::interrupted() const
  13  {
  14      return flag.load(std::memory_order_acquire);
  15  }
  16  
  17  CThreadInterrupt::operator bool() const
  18  {
  19      return interrupted();
  20  }
  21  
  22  void CThreadInterrupt::reset()
  23  {
  24      flag.store(false, std::memory_order_release);
  25  }
  26  
  27  void CThreadInterrupt::operator()()
  28  {
  29      {
  30          LOCK(mut);
  31          flag.store(true, std::memory_order_release);
  32      }
  33      cond.notify_all();
  34  }
  35  
  36  bool CThreadInterrupt::sleep_for(Clock::duration rel_time)
  37  {
  38      WAIT_LOCK(mut, lock);
  39      return !cond.wait_for(lock, rel_time, [this]() { return flag.load(std::memory_order_acquire); });
  40  }
  41