summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/thread/test/test_7571.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
commit483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch)
treee5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/thread/test/test_7571.cpp
parentInitial commit. (diff)
downloadceph-upstream.tar.xz
ceph-upstream.zip
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/thread/test/test_7571.cpp')
-rw-r--r--src/boost/libs/thread/test/test_7571.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/boost/libs/thread/test/test_7571.cpp b/src/boost/libs/thread/test/test_7571.cpp
new file mode 100644
index 00000000..a336795f
--- /dev/null
+++ b/src/boost/libs/thread/test/test_7571.cpp
@@ -0,0 +1,93 @@
+// Copyright (C) 2012 Vicente Botet
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#define BOOST_THREAD_VERSION 2
+
+#include <boost/date_time.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/thread_only.hpp>
+#include <iostream>
+
+// Number should be big enough to allow context switch between threads, otherwise the bug doesn't show.
+static int MAX_COUNTS;
+
+class ItemKeeper {
+
+public:
+ ItemKeeper() { }
+
+ void doSomething() {
+ boost::unique_lock<boost::mutex> scoped_lock(mutex);
+ int counts = MAX_COUNTS;
+ while (counts--);
+ }
+
+private:
+ boost::mutex mutex;
+};
+
+ItemKeeper itemKeeper;
+
+int MAX_ITERATIONS(5);
+
+void threadFunc(int invokerID, bool& exceptionOccurred) {
+ try {
+ for (int i = 0; i < MAX_ITERATIONS; i++) {
+ std::cout << "Thread " << invokerID << ", iteration " << i << std::endl;
+ itemKeeper.doSomething();
+ }
+ } catch (...) {
+ exceptionOccurred = true;
+ }
+}
+
+
+int main(int argc, char* argv[]) {
+ if (argc < 2) {
+ MAX_COUNTS = 5000000;
+ } else {
+ std::string valueStr(argv[1]);
+ bool has_only_digits = (valueStr.find_first_not_of( "0123456789" ) == std::string::npos);
+ if (has_only_digits) {
+ std::istringstream aStream(valueStr);
+ aStream >> MAX_COUNTS;
+ } else {
+ std::cerr << "Argument should be an integer\n";
+ return 1;
+ }
+ }
+
+ bool exceptionOccurred1(false);
+ bool exceptionOccurred2(false);
+
+ boost::thread thread1(threadFunc, 1, boost::ref(exceptionOccurred1));
+ boost::thread thread2(threadFunc, 2, boost::ref(exceptionOccurred2));
+
+ boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(10000*100);
+
+ bool deadlockOccured(false);
+ //thread1.join();
+ //thread2.join();
+
+ if (!thread1.timed_join(timeout)) {
+ deadlockOccured = true;
+ thread1.interrupt();
+ }
+ if (!thread2.timed_join(timeout)) {
+ deadlockOccured = true;
+ thread2.interrupt();
+ }
+
+ if (deadlockOccured) {
+ std::cout << "Deadlock occurred\n";
+ return 1;
+ }
+ if (exceptionOccurred1 || exceptionOccurred2) {
+ std::cout << "Exception occurred\n";
+ return 1;
+ }
+ return 0;
+}
+