diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2014-03-26 02:11:47 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2014-03-26 02:11:47 +0000 |
commit | f4c0c708a375c621cb2f656a6d4f99e0feb19b39 (patch) | |
tree | e0e7ad9d34c87f8da5313af22ac223a35d5716ee | |
parent | ab5e0a72d5c1cfe39c366bf02662601bc87903f9 (diff) | |
download | libcxx_35a-f4c0c708a375c621cb2f656a6d4f99e0feb19b39.tar.gz |
Add tests that should fail when lock() throws. THis is part of LWG issue #2135. No library changes here.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@204777 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp | 52 | ||||
-rw-r--r-- | test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp | 52 |
2 files changed, 104 insertions, 0 deletions
diff --git a/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp new file mode 100644 index 00000000..dd4879de --- /dev/null +++ b/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/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp b/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp new file mode 100644 index 00000000..7eb4b335 --- /dev/null +++ b/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); +} |