| Index: src/Latch.h |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/src/Latch.h |
| @@ -0,0 +1,96 @@ |
| +/* |
| + * This file is part of Adblock Plus <https://adblockplus.org/>, |
| + * Copyright (C) 2006-2016 Eyeo GmbH |
| + * |
| + * Adblock Plus is free software: you can redistribute it and/or modify |
| + * it under the terms of the GNU General Public License version 3 as |
| + * published by the Free Software Foundation. |
| + * |
| + * Adblock Plus is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| + */ |
| + |
| +#if !defined(LATCH_H) |
| +#define LATCH_H |
| + |
| +#include <condition_variable> |
| +#include <mutex> |
| +#include <stdexcept> |
| + |
| +/** |
| + * Latch class mimicking the concept in C++ Concurrency TS. |
| + * Only some of the member functions are implemented. |
| + * |
| + * \par Reference |
| + * - N3998 C++ Latches and Barriers |
| + * http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3998.html |
| + */ |
| +class Latch |
| +{ |
| + /** |
| + * Internal count. |
| + * |
| + * The synchronization condition is that \c count is zero. |
| + */ |
| + int count; |
| + |
| + /** |
| + * Mutex protecting the integrity of the count. |
| + * This mutex is only used transiently. |
| + */ |
| + std::mutex m; |
| + |
| + typedef std::unique_lock<std::mutex> UniqueLockType; |
| + |
| + /** |
| + * Condition variable blocking for Wait(). |
| + * |
| + * \par Invariant |
| + * - If the synchronization condition has not been met, mutexBlocking is locked. |
| + */ |
| + std::condition_variable cv; |
| + |
| + bool synchronizationCondition() const |
| + { |
| + return count == 0; |
| + } |
| + |
| +public: |
| + /** |
| + * Initializes the latch with a count of 'initialCount'. |
| + */ |
| + Latch(int initialCount) |
| + : count(initialCount) |
| + {} |
| + |
| + /** |
| + * \par Precondition |
| + * - No threads are blocked at the synchronization point. |
| + */ |
| + ~Latch() {}; |
| + |
| + /** |
| + * Decrements the internal count by 1. |
| + * If the count reaches 0 the synchronization condition is reached. |
| + */ |
| + void Arrive(); |
| + |
| + /** |
| + * Blocks the calling thread at the synchronization point |
| + * until the synchronization condition is reached. |
| + * If the condition has already been reached, the thread does not block. |
| + */ |
| + void Wait(); |
| + |
| + /** |
| + * Return the current value of the synchroniztion condition. |
| + */ |
| + bool TryWait(); |
| +}; |
| + |
| +#endif |