| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 /* | 
|  | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 
|  | 3 * Copyright (C) 2006-2017 eyeo GmbH | 
|  | 4 * | 
|  | 5 * Adblock Plus is free software: you can redistribute it and/or modify | 
|  | 6 * it under the terms of the GNU General Public License version 3 as | 
|  | 7 * published by the Free Software Foundation. | 
|  | 8 * | 
|  | 9 * Adblock Plus is distributed in the hope that it will be useful, | 
|  | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 12 * GNU General Public License for more details. | 
|  | 13 * | 
|  | 14 * You should have received a copy of the GNU General Public License | 
|  | 15 * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 16 */ | 
|  | 17 | 
|  | 18 #include "DefaultTimer.h" | 
|  | 19 | 
|  | 20 using AdblockPlus::DefaultTimer; | 
|  | 21 | 
|  | 22 DefaultTimer::DefaultTimer() | 
|  | 23   : shouldThreadStop(false) | 
|  | 24 { | 
|  | 25   m_thread = std::thread([this] | 
|  | 26   { | 
|  | 27     ThreadFunc(); | 
|  | 28   }); | 
|  | 29 } | 
|  | 30 | 
|  | 31 DefaultTimer::~DefaultTimer() | 
|  | 32 { | 
|  | 33   shouldThreadStop = true; | 
|  | 34   conditionVariable.notify_one(); | 
|  | 35   if (m_thread.joinable()) | 
|  | 36     m_thread.join(); | 
|  | 37 } | 
|  | 38 | 
|  | 39 void DefaultTimer::SetTimer(const std::chrono::milliseconds& timeout, const Time
    rCallback& timerCallback) | 
|  | 40 { | 
|  | 41   if (!timerCallback) | 
|  | 42     return; | 
|  | 43   std::lock_guard<std::mutex> lock(mutex); | 
|  | 44   TimerUnit timer = { std::chrono::steady_clock::now() + timeout, timerCallback 
    }; | 
|  | 45   timers.push(timer); | 
|  | 46   conditionVariable.notify_one(); | 
|  | 47 } | 
|  | 48 | 
|  | 49 void DefaultTimer::ThreadFunc() | 
|  | 50 { | 
|  | 51   while (!shouldThreadStop) | 
|  | 52   { | 
|  | 53     std::unique_lock<std::mutex> lock(mutex); | 
|  | 54     if (timers.empty()) | 
|  | 55     { | 
|  | 56       conditionVariable.wait(lock, [this]()->bool | 
|  | 57       { | 
|  | 58         return shouldThreadStop || !timers.empty(); | 
|  | 59       }); | 
|  | 60     } | 
|  | 61     else | 
|  | 62     { | 
|  | 63       conditionVariable.wait_until(lock, timers.top().fireAt); | 
|  | 64     } | 
|  | 65     // execute all expired timers and remove them | 
|  | 66     while (!shouldThreadStop && !timers.empty() && timers.top().fireAt <= std::c
    hrono::steady_clock::now()) | 
|  | 67     { | 
|  | 68       auto callback = timers.top().callback; | 
|  | 69       timers.pop(); | 
|  | 70       // allow to put new timers while this timer is being processed | 
|  | 71       lock.unlock(); | 
|  | 72       try | 
|  | 73       { | 
|  | 74         callback(); | 
|  | 75       } | 
|  | 76       catch (...) | 
|  | 77       { | 
|  | 78         // do nothing, but the thread will be alive. | 
|  | 79       } | 
|  | 80       lock.lock(); | 
|  | 81     } | 
|  | 82   } | 
|  | 83 } | 
| OLD | NEW | 
|---|