summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/test/threads.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/test/threads.cpp')
-rw-r--r--ml/dlib/dlib/test/threads.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/ml/dlib/dlib/test/threads.cpp b/ml/dlib/dlib/test/threads.cpp
new file mode 100644
index 00000000..1aeb1a3f
--- /dev/null
+++ b/ml/dlib/dlib/test/threads.cpp
@@ -0,0 +1,158 @@
+// Copyright (C) 2006 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+
+
+#include <sstream>
+#include <string>
+#include <cstdlib>
+#include <ctime>
+#include <dlib/misc_api.h>
+#include <dlib/threads.h>
+
+#include "tester.h"
+
+namespace
+{
+ using namespace test;
+ using namespace dlib;
+ using namespace std;
+
+ logger dlog("test.threads");
+
+ void test_async()
+ {
+#if __cplusplus >= 201103
+ print_spinner();
+ auto v1 = dlib::async([]() { dlib::sleep(500); return 1; }).share();
+ auto v2 = dlib::async([v1]() { dlib::sleep(400); return v1.get()+1; }).share();
+ auto v3 = dlib::async([v2](int a) { dlib::sleep(300); return v2.get()+a; },2).share();
+ auto v4 = dlib::async([v3]() { dlib::sleep(200); return v3.get()+1; });
+
+ DLIB_TEST(v4.get() == 5);
+
+ print_spinner();
+ auto except = dlib::async([](){ dlib::sleep(300); throw error("oops"); });
+ bool got_exception = false;
+ try
+ {
+ except.get();
+ }
+ catch (error&e)
+ {
+ got_exception = true;
+ DLIB_TEST(e.what() == string("oops"));
+ }
+ DLIB_TEST(got_exception);
+#endif
+ }
+
+ class threads_tester : public tester
+ {
+ public:
+ threads_tester (
+ ) :
+ tester ("test_threads",
+ "Runs tests on the threads component."),
+ sm(cm)
+ {}
+
+ thread_specific_data<int> tsd;
+ rmutex cm;
+ rsignaler sm;
+ int count;
+ bool failure;
+
+ void perform_test (
+ )
+ {
+ failure = false;
+ print_spinner();
+
+
+ count = 10;
+ if (!create_new_thread<threads_tester,&threads_tester::thread1>(*this)) failure = true;
+ if (!create_new_thread<threads_tester,&threads_tester::thread2>(*this)) failure = true;
+ if (!create_new_thread<threads_tester,&threads_tester::thread3>(*this)) failure = true;
+ if (!create_new_thread<threads_tester,&threads_tester::thread4>(*this)) failure = true;
+ if (!create_new_thread<threads_tester,&threads_tester::thread5>(*this)) failure = true;
+ if (!create_new_thread<threads_tester,&threads_tester::thread6>(*this)) failure = true;
+ if (!create_new_thread<threads_tester,&threads_tester::thread7>(*this)) failure = true;
+ if (!create_new_thread<threads_tester,&threads_tester::thread8>(*this)) failure = true;
+ if (!create_new_thread<threads_tester,&threads_tester::thread9>(*this)) failure = true;
+ if (!create_new_thread<threads_tester,&threads_tester::thread10>(*this)) failure = true;
+
+ thread(66);
+
+ // this should happen in the main program thread
+ if (is_dlib_thread())
+ failure = true;
+
+ auto_mutex M(cm);
+ while (count > 0 && !failure)
+ sm.wait();
+
+
+ DLIB_TEST(!failure);
+
+ test_async();
+ }
+
+ void thread_end_handler (
+ )
+ {
+ auto_mutex M(cm);
+ --count;
+ if (count == 0)
+ sm.signal();
+ }
+
+ void thread1() { thread(1); }
+ void thread2()
+ {
+ thread(2);
+ if (is_dlib_thread() == false)
+ failure = true;
+ }
+ void thread3() { thread(3); }
+ void thread4() { thread(4); }
+ void thread5() { thread(5); }
+ void thread6() { thread(6); }
+ void thread7() { thread(7); }
+ void thread8() { thread(8); }
+ void thread9() { thread(9); }
+ void thread10() { thread(10); }
+
+ void thread (
+ int num
+ )
+ {
+ dlog << LTRACE << "starting thread num " << num;
+ if (is_dlib_thread())
+ register_thread_end_handler(*this,&threads_tester::thread_end_handler);
+ tsd.data() = num;
+ for (int i = 0; i < 0x3FFFF; ++i)
+ {
+ if ((i&0xFFF) == 0)
+ {
+ print_spinner();
+ dlib::sleep(10);
+ }
+ // if this isn't equal to num then there is a problem with the thread specific data stuff
+ if (tsd.data() != num)
+ {
+ auto_mutex M(cm);
+ failure = true;
+ sm.signal();
+ }
+ }
+ dlog << LTRACE << "ending of thread num " << num;
+
+
+ }
+ } a;
+
+
+}
+
+
+