summaryrefslogtreecommitdiffstats
path: root/libcxx/test
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2014-03-26 02:11:47 +0000
committerMarshall Clow <mclow.lists@gmail.com>2014-03-26 02:11:47 +0000
commit28c391f68e95408ef263bad494addc5e77975e50 (patch)
treeedb924723b43f3b5efd6b485db71dd6375127f4e /libcxx/test
parent19582e97904efcf1f9fad7d37d42071d3ec00580 (diff)
downloadbcm5719-llvm-28c391f68e95408ef263bad494addc5e77975e50.tar.gz
bcm5719-llvm-28c391f68e95408ef263bad494addc5e77975e50.zip
Add tests that should fail when lock() throws. THis is part of LWG issue #2135. No library changes here.
llvm-svn: 204777
Diffstat (limited to 'libcxx/test')
-rw-r--r--libcxx/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp52
-rw-r--r--libcxx/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp52
2 files changed, 104 insertions, 0 deletions
diff --git a/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp b/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp
new file mode 100644
index 00000000000..dd4879ded46
--- /dev/null
+++ b/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp
@@ -0,0 +1,52 @@
+#include <thread>
+#include <condition_variable>
+#include <mutex>
+#include <chrono>
+#include <iostream>
+#include <cassert>
+
+void f1()
+{
+ std::exit(0);
+}
+
+struct Mutex
+{
+ unsigned state = 0;
+ Mutex() = default;
+ ~Mutex() = default;
+ Mutex(const Mutex&) = delete;
+ Mutex& operator=(const Mutex&) = delete;
+
+ void lock()
+ {
+ if (++state == 2)
+ throw 1; // this throw should end up calling terminate()
+ }
+
+ void unlock() {}
+};
+
+Mutex mut;
+std::condition_variable_any cv;
+
+void
+signal_me()
+{
+ std::this_thread::sleep_for(std::chrono::milliseconds(500));
+ cv.notify_one();
+}
+
+int
+main()
+{
+ std::set_terminate(f1);
+ try
+ {
+ std::thread(signal_me).detach();
+ mut.lock();
+ cv.wait(mut);
+ }
+ catch (...) {}
+ assert(false);
+}
diff --git a/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp b/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp
new file mode 100644
index 00000000000..7eb4b33558b
--- /dev/null
+++ b/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp
@@ -0,0 +1,52 @@
+#include <thread>
+#include <condition_variable>
+#include <mutex>
+#include <chrono>
+#include <iostream>
+#include <cassert>
+
+void f1()
+{
+ std::exit(0);
+}
+
+struct Mutex
+{
+ unsigned state = 0;
+ Mutex() = default;
+ ~Mutex() = default;
+ Mutex(const Mutex&) = delete;
+ Mutex& operator=(const Mutex&) = delete;
+
+ void lock()
+ {
+ if (++state == 2)
+ throw 1; // this throw should end up calling terminate()
+ }
+
+ void unlock() {}
+};
+
+Mutex mut;
+std::condition_variable_any cv;
+
+void
+signal_me()
+{
+ std::this_thread::sleep_for(std::chrono::milliseconds(500));
+ cv.notify_one();
+}
+
+int
+main()
+{
+ std::set_terminate(f1);
+ try
+ {
+ std::thread(signal_me).detach();
+ mut.lock();
+ cv.wait_for(mut, std::chrono::milliseconds(250));
+ }
+ catch (...) {}
+ assert(false);
+}
OpenPOWER on IntegriCloud