summaryrefslogtreecommitdiffstats
path: root/lldb/test/functionalities/stop-hook/multiple_threads
diff options
context:
space:
mode:
authorChaoren Lin <chaorenl@google.com>2015-03-02 19:12:18 +0000
committerChaoren Lin <chaorenl@google.com>2015-03-02 19:12:18 +0000
commitac8263dbf0ae9d1b53f1bb42936ae857bd4c77f7 (patch)
treec2e0da6e9eeef8691741c1266c656df43867e5ac /lldb/test/functionalities/stop-hook/multiple_threads
parent1f72a0006ca727eab0d279fa9e08855706e4efc3 (diff)
downloadbcm5719-llvm-ac8263dbf0ae9d1b53f1bb42936ae857bd4c77f7.tar.gz
bcm5719-llvm-ac8263dbf0ae9d1b53f1bb42936ae857bd4c77f7.zip
Applying D7950 to four near copies of the file.
Summary: Using std::thread/random instead of pthread/rand. Two of them also suffered from the synchronization problem in D7916. Reviewers: clayborg, zturner, ki.stfu Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D7991 llvm-svn: 230993
Diffstat (limited to 'lldb/test/functionalities/stop-hook/multiple_threads')
-rw-r--r--lldb/test/functionalities/stop-hook/multiple_threads/Makefile2
-rw-r--r--lldb/test/functionalities/stop-hook/multiple_threads/main.cpp65
2 files changed, 28 insertions, 39 deletions
diff --git a/lldb/test/functionalities/stop-hook/multiple_threads/Makefile b/lldb/test/functionalities/stop-hook/multiple_threads/Makefile
index 035413ff763..b5d93fb1166 100644
--- a/lldb/test/functionalities/stop-hook/multiple_threads/Makefile
+++ b/lldb/test/functionalities/stop-hook/multiple_threads/Makefile
@@ -1,6 +1,6 @@
LEVEL = ../../../make
CXX_SOURCES := main.cpp
-ENABLE_THREADS := YES
+ENABLE_STD_THREADS := YES
include $(LEVEL)/Makefile.rules
diff --git a/lldb/test/functionalities/stop-hook/multiple_threads/main.cpp b/lldb/test/functionalities/stop-hook/multiple_threads/main.cpp
index 789a10f74e6..e193ae18e2c 100644
--- a/lldb/test/functionalities/stop-hook/multiple_threads/main.cpp
+++ b/lldb/test/functionalities/stop-hook/multiple_threads/main.cpp
@@ -7,41 +7,37 @@
//
//===----------------------------------------------------------------------===//
-// C includes
-#include <pthread.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <unistd.h>
+#include <chrono>
+#include <cstdio>
+#include <mutex>
+#include <random>
+#include <thread>
-pthread_t g_thread_1 = NULL;
-pthread_t g_thread_2 = NULL;
-pthread_t g_thread_3 = NULL;
+std::default_random_engine g_random_engine{std::random_device{}()};
+std::uniform_int_distribution<> g_distribution{0, 3000000};
uint32_t g_val = 0;
-uint32_t access_pool (uint32_t flag = 0);
-
uint32_t
-access_pool (uint32_t flag)
+access_pool (bool flag = false)
{
- static pthread_mutex_t g_access_mutex = PTHREAD_MUTEX_INITIALIZER;
- if (flag == 0)
- ::pthread_mutex_lock (&g_access_mutex);
+ static std::mutex g_access_mutex;
+ if (!flag)
+ g_access_mutex.lock();
uint32_t old_val = g_val;
- if (flag != 0)
+ if (flag)
g_val = old_val + 1;
- if (flag == 0)
- ::pthread_mutex_unlock (&g_access_mutex);
+ if (!flag)
+ g_access_mutex.unlock();
return g_val;
}
-void *
-thread_func (void *arg)
+void
+thread_func (uint32_t thread_index)
{
- uint32_t thread_index = *((uint32_t *)arg); // Break here to test that the stop-hook mechanism works for multiple threads.
+ // Break here to test that the stop-hook mechanism works for multiple threads.
printf ("%s (thread index = %u) startng...\n", __FUNCTION__, thread_index);
uint32_t count = 0;
@@ -49,40 +45,33 @@ thread_func (void *arg)
while (count++ < 15)
{
// random micro second sleep from zero to 3 seconds
- int usec = ::rand() % 3000000;
+ int usec = g_distribution(g_random_engine);
printf ("%s (thread = %u) doing a usleep (%d)...\n", __FUNCTION__, thread_index, usec);
- ::usleep (usec);
-
+ std::this_thread::sleep_for(std::chrono::microseconds{usec});
+
if (count < 7)
val = access_pool ();
else
- val = access_pool (1);
-
+ val = access_pool (true);
+
printf ("%s (thread = %u) after usleep access_pool returns %d (count=%d)...\n", __FUNCTION__, thread_index, val, count);
}
printf ("%s (thread index = %u) exiting...\n", __FUNCTION__, thread_index);
- return NULL;
}
int main (int argc, char const *argv[])
{
- int err;
- void *thread_result = NULL;
- uint32_t thread_index_1 = 1;
- uint32_t thread_index_2 = 2;
- uint32_t thread_index_3 = 3;
+ std::thread threads[3];
printf ("Before turning all three threads loose...\n"); // Set break point at this line, and add a stop-hook.
// Create 3 threads
- err = ::pthread_create (&g_thread_1, NULL, thread_func, &thread_index_1);
- err = ::pthread_create (&g_thread_2, NULL, thread_func, &thread_index_2);
- err = ::pthread_create (&g_thread_3, NULL, thread_func, &thread_index_3);
+ for (auto &thread : threads)
+ thread = std::thread{thread_func, std::distance(threads, &thread)};
// Join all of our threads
- err = ::pthread_join (g_thread_1, &thread_result);
- err = ::pthread_join (g_thread_2, &thread_result);
- err = ::pthread_join (g_thread_3, &thread_result);
+ for (auto &thread : threads)
+ thread.join();
return 0;
}
OpenPOWER on IntegriCloud