diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index a9417b158..007b7b2c5 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -230,6 +230,8 @@ EXTRA_DIST = \ sigalrm.vgtest \ sigaltstack.stderr.exp \ sigaltstack.vgtest \ + std_atomic.stderr.exp \ + std_atomic.vgtest \ std_list.stderr.exp \ std_list.vgtest \ std_string.stderr.exp \ @@ -376,6 +378,7 @@ endif if CXX_CAN_INCLUDE_THREAD_HEADER if HAVE_SHARED_POINTER_ANNOTATION check_PROGRAMS += \ + std_atomic \ std_list \ std_string \ std_thread @@ -458,6 +461,9 @@ if HAVE_PTHREAD_BARRIER matinv_LDADD = $(LDADD) -lm endif +std_atomic_SOURCES = std_atomic.cpp +std_atomic_CXXFLAGS = $(AM_CXXFLAGS) -std=c++0x -Wno-sign-compare + std_list_SOURCES = std_list.cpp std_list_CXXFLAGS = $(AM_CXXFLAGS) -std=c++0x -Wno-sign-compare diff --git a/drd/tests/std_atomic.cpp b/drd/tests/std_atomic.cpp new file mode 100644 index 000000000..9cdc1e56e --- /dev/null +++ b/drd/tests/std_atomic.cpp @@ -0,0 +1,56 @@ +/* + * Test program for std::atomic<> + * + * See also https://bugs.kde.org/show_bug.cgi?id=328490. + */ + +#include "../drd.h" +#include +#include +#include +#include + +std::atomic g_b; + +void *func1(void *instance) +{ + while (!g_b) { + timespec delay = { 0, 100 * 1000 * 1000 }; + nanosleep(&delay, NULL); + } + return NULL; +} + +void *func2(void *instance) +{ + g_b = true; + return NULL; +} + +int main(int argc, char* argv[]) +{ + int err; + pthread_t thread1; + pthread_t thread2; + + std::cerr << "Started.\n"; + + if (argc > 1) + DRD_IGNORE_VAR(g_b); + + err = pthread_create(&thread1, NULL, &func1, NULL); + if (err != 0) + throw std::string("failed to create a thread."); + err = pthread_create(&thread2, NULL, &func2, NULL); + if (err != 0) + throw std::string("failed to create a thread."); + + err = pthread_join(thread1, NULL); + if (err != 0) + throw std::string("Thread::join(): failed to join."); + err = pthread_join(thread2, NULL); + if (err != 0) + throw std::string("Thread::join(): failed to join."); + + std::cerr << "Done.\n"; +} diff --git a/drd/tests/std_atomic.stderr.exp b/drd/tests/std_atomic.stderr.exp new file mode 100644 index 000000000..2582960a6 --- /dev/null +++ b/drd/tests/std_atomic.stderr.exp @@ -0,0 +1,5 @@ + +Started. +Done. + +ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) diff --git a/drd/tests/std_atomic.vgtest b/drd/tests/std_atomic.vgtest new file mode 100644 index 000000000..c675375d1 --- /dev/null +++ b/drd/tests/std_atomic.vgtest @@ -0,0 +1,4 @@ +prereq: test -e std_atomic && ./supported_libpthread +vgopts: --check-stack-var=yes --show-confl-seg=no +prog: std_atomic 1 +stderr_filter: filter_stderr