diff options
| author | Chaoren Lin <chaorenl@google.com> | 2015-03-02 19:12:18 +0000 |
|---|---|---|
| committer | Chaoren Lin <chaorenl@google.com> | 2015-03-02 19:12:18 +0000 |
| commit | ac8263dbf0ae9d1b53f1bb42936ae857bd4c77f7 (patch) | |
| tree | c2e0da6e9eeef8691741c1266c656df43867e5ac /lldb/test/functionalities/stop-hook/multiple_threads | |
| parent | 1f72a0006ca727eab0d279fa9e08855706e4efc3 (diff) | |
| download | bcm5719-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/Makefile | 2 | ||||
| -rw-r--r-- | lldb/test/functionalities/stop-hook/multiple_threads/main.cpp | 65 |
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; } |

