[Lldb-commits] [lldb] r230799 - Convert TestWatchLocation to use C++11 library instead of pthread.

Chaoren Lin chaorenl at google.com
Fri Feb 27 13:45:52 PST 2015


Author: chaoren
Date: Fri Feb 27 15:45:51 2015
New Revision: 230799

URL: http://llvm.org/viewvc/llvm-project?rev=230799&view=rev
Log:
Convert TestWatchLocation to use C++11 library instead of pthread.

Reviewers: clayborg, zturner, ki.stfu, abidh

Subscribers: lldb-commits

Differential Revision: http://reviews.llvm.org/D7950

Modified:
    lldb/trunk/test/functionalities/watchpoint/hello_watchlocation/TestWatchLocation.py
    lldb/trunk/test/functionalities/watchpoint/hello_watchlocation/main.cpp

Modified: lldb/trunk/test/functionalities/watchpoint/hello_watchlocation/TestWatchLocation.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/watchpoint/hello_watchlocation/TestWatchLocation.py?rev=230799&r1=230798&r2=230799&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/watchpoint/hello_watchlocation/TestWatchLocation.py (original)
+++ lldb/trunk/test/functionalities/watchpoint/hello_watchlocation/TestWatchLocation.py Fri Feb 27 15:45:51 2015
@@ -77,7 +77,7 @@ class HelloWatchLocationTestCase(TestBas
         self.expect(self.res.GetOutput().splitlines()[0], exe=False,
             endstr = ' = 0')
 
-        self.runCmd("watchpoint set expression -w write -x 4 -- &g_thread_1")
+        self.runCmd("watchpoint set expression -w write -x 4 -- &threads[0]")
 
         # Use the '-v' option to do verbose listing of the watchpoint.
         # The hit count should be 0 initially.

Modified: lldb/trunk/test/functionalities/watchpoint/hello_watchlocation/main.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/watchpoint/hello_watchlocation/main.cpp?rev=230799&r1=230798&r2=230799&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/watchpoint/hello_watchlocation/main.cpp (original)
+++ lldb/trunk/test/functionalities/watchpoint/hello_watchlocation/main.cpp Fri Feb 27 15:45:51 2015
@@ -7,21 +7,29 @@
 //
 //===----------------------------------------------------------------------===//
 
-// C includes
-#include <pthread.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <atomic>
-
-pthread_t g_thread_1 = NULL;
-pthread_t g_thread_2 = NULL;
-pthread_t g_thread_3 = NULL;
+#include <chrono>
+#include <condition_variable>
+#include <cstdio>
+#include <random>
+#include <thread>
+
+std::default_random_engine g_random_engine{std::random_device{}()};
+std::uniform_int_distribution<> g_distribution{0, 3000000};
+std::condition_variable g_condition_variable;
+std::mutex g_mutex;
+int g_count;
 
-std::atomic_bool g_ready(false);
+char *g_char_ptr = nullptr;
 
-char *g_char_ptr = NULL;
+void
+barrier_wait()
+{
+    std::unique_lock<std::mutex> lock{g_mutex};
+    if (--g_count > 0)
+        g_condition_variable.wait(lock);
+    else
+        g_condition_variable.notify_all();
+}
 
 void
 do_bad_thing_with_location(char *char_ptr, char new_val)
@@ -31,77 +39,69 @@ do_bad_thing_with_location(char *char_pt
     *char_ptr = new_val;
 }
 
-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();
 
     char old_val = *g_char_ptr;
-    if (flag != 0)
+    if (flag)
         do_bad_thing_with_location(g_char_ptr, old_val + 1);
 
-    if (flag == 0)
-        ::pthread_mutex_unlock (&g_access_mutex);
+    if (!flag)
+        g_access_mutex.unlock();
     return *g_char_ptr;
 }
 
-void *
-thread_func (void *arg)
+void
+thread_func (uint32_t thread_index)
 {
-    uint32_t thread_index = *((uint32_t *)arg);
     printf ("%s (thread index = %u) startng...\n", __FUNCTION__, thread_index);
 
-    while (!g_ready);
+    barrier_wait();
 
     uint32_t count = 0;
     uint32_t val;
     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;
-
-    g_char_ptr = (char *)malloc (1);
+    g_char_ptr = new char;
     *g_char_ptr = 0;
 
+    std::thread threads[3];
+    g_count = 4;
+
     // 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)};
 
     printf ("Before turning all three threads loose...\n"); // Set break point at this line.
-    g_ready = true;
+    barrier_wait();
 
     // 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);
-    free(g_char_ptr);
+    for (auto &thread : threads)
+        thread.join();
+
+    delete g_char_ptr;
 
     return 0;
 }





More information about the lldb-commits mailing list