Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: src/Latch.h

Issue 29372702: Issue #4826 - Use latch to replace thread-sleeping in tests
Patch Set: stray comments Created Jan. 20, 2017, 1:29 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « libadblockplus.gyp ('k') | src/Latch.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « libadblockplus.gyp ('k') | src/Latch.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld