Index: src/Thread.h |
=================================================================== |
--- a/src/Thread.h |
+++ b/src/Thread.h |
@@ -13,24 +13,73 @@ |
* |
* You should have received a copy of the GNU General Public License |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
#ifndef ADBLOCKPLUS_THREAD_H |
#define ADBLOCKPLUS_THREAD_H |
+#include <chrono> |
+#include <condition_variable> |
+#include <mutex> |
+#include <string> |
+ |
#ifdef WIN32 |
#include <windows.h> |
#else |
#include <pthread.h> |
#endif |
namespace AdblockPlus |
{ |
+ class Sync |
+ { |
+ public: |
+ Sync() |
+ : isSet(false) |
+ { |
+ } |
+ void Wait() |
+ { |
+ std::unique_lock<std::mutex> lock(mutex); |
+ if (!isSet) |
+ cv.wait(lock); |
+ } |
+ |
+ template<class R = typename std::chrono::seconds::rep, |
+ class P = std::ratio<1>> |
+ bool WaitFor(const std::chrono::duration<R, P>& duration = std::chrono::seconds(20)) |
+ { |
+ std::unique_lock<std::mutex> lock(mutex); |
+ if (!isSet) |
+ return cv.wait_for(lock, duration) == std::cv_status::no_timeout; |
+ return true; |
+ } |
+ void Set(const std::string& err = std::string()) |
+ { |
+ { |
+ std::unique_lock<std::mutex> lock(mutex); |
+ isSet = true; |
+ error = err; |
+ } |
+ cv.notify_all(); |
+ } |
+ std::string GetError() |
+ { |
+ std::unique_lock<std::mutex> lock(mutex); |
+ return error; |
+ } |
+ private: |
+ std::mutex mutex; |
+ std::condition_variable cv; |
+ bool isSet; |
+ std::string error; |
+ }; |
+ |
void Sleep(int millis); |
class Mutex |
{ |
public: |
#ifdef WIN32 |
CRITICAL_SECTION nativeMutex; |
#else |