[ASan] Refactor thread starting code.
authorSergey Matveev <earthdok@google.com>
Fri, 5 Dec 2014 17:31:13 +0000 (17:31 +0000)
committerSergey Matveev <earthdok@google.com>
Fri, 5 Dec 2014 17:31:13 +0000 (17:31 +0000)
Move thread context creation into AsanThread::Create().

llvm-svn: 223483

compiler-rt/lib/asan/asan_interceptors.cc
compiler-rt/lib/asan/asan_mac.cc
compiler-rt/lib/asan/asan_rtl.cc
compiler-rt/lib/asan/asan_thread.cc
compiler-rt/lib/asan/asan_thread.h

index 460b8cc..53c54c1 100644 (file)
@@ -197,10 +197,8 @@ INTERCEPTOR(int, pthread_create, void *thread,
   int result = REAL(pthread_create)(thread, attr, asan_thread_start, &param);
   if (result == 0) {
     u32 current_tid = GetCurrentTidOrInvalid();
-    AsanThread *t = AsanThread::Create(start_routine, arg);
-    CreateThreadContextArgs args = { t, &stack };
-    asanThreadRegistry().CreateThread(*reinterpret_cast<uptr *>(t), detached,
-                                      current_tid, &args);
+    AsanThread *t =
+        AsanThread::Create(start_routine, arg, current_tid, &stack, detached);
     atomic_store(&param.t, reinterpret_cast<uptr>(t), memory_order_release);
     // Wait until the AsanThread object is initialized and the ThreadRegistry
     // entry is in "started" state. One reason for this is that after this
@@ -739,10 +737,8 @@ INTERCEPTOR_WINAPI(DWORD, CreateThread,
                                     &param, thr_flags, tid);
   if (result) {
     u32 current_tid = GetCurrentTidOrInvalid();
-    AsanThread *t = AsanThread::Create(start_routine, arg);
-    CreateThreadContextArgs args = { t, &stack };
-    asanThreadRegistry().CreateThread(*reinterpret_cast<uptr *>(t), detached,
-                                      current_tid, &args);
+    AsanThread *t =
+        AsanThread::Create(start_routine, arg, current_tid, &stack, detached);
     atomic_store(&param.t, reinterpret_cast<uptr>(t), memory_order_release);
     // The pthread_create interceptor waits here, so we do the same for
     // consistency.
index 4014357..ae0fa15 100644 (file)
@@ -264,9 +264,8 @@ ALWAYS_INLINE
 void asan_register_worker_thread(int parent_tid, StackTrace *stack) {
   AsanThread *t = GetCurrentThread();
   if (!t) {
-    t = AsanThread::Create(0, 0);
-    CreateThreadContextArgs args = { t, stack };
-    asanThreadRegistry().CreateThread(*(uptr*)t, true, parent_tid, &args);
+    t = AsanThread::Create(/* start_routine */ nullptr, /* arg */ nullptr,
+                           parent_tid, stack, /* detached */ true);
     t->Init();
     asanThreadRegistry().StartThread(t->tid(), 0, 0);
     SetCurrentThread(t);
index 87c1fc8..949ccdf 100644 (file)
@@ -674,11 +674,10 @@ static void AsanInitInternal() {
   InitTlsSize();
 
   // Create main thread.
-  AsanThread *main_thread = AsanThread::Create(0, 0);
-  CreateThreadContextArgs create_main_args = { main_thread, 0 };
-  u32 main_tid = asanThreadRegistry().CreateThread(
-      0, true, 0, &create_main_args);
-  CHECK_EQ(0, main_tid);
+  AsanThread *main_thread = AsanThread::Create(
+      /* start_routine */ nullptr, /* arg */ nullptr, /* parent_tid */ 0,
+      /* stack */ nullptr, /* detached */ true);
+  CHECK_EQ(0, main_thread->tid());
   SetCurrentThread(main_thread);
   main_thread->ThreadStart(internal_getpid(),
                            /* signal_thread_is_registered */ nullptr);
index f6c0f44..9af5706 100644 (file)
@@ -27,6 +27,11 @@ namespace __asan {
 
 // AsanThreadContext implementation.
 
+struct CreateThreadContextArgs {
+  AsanThread *thread;
+  StackTrace *stack;
+};
+
 void AsanThreadContext::OnCreated(void *arg) {
   CreateThreadContextArgs *args = static_cast<CreateThreadContextArgs*>(arg);
   if (args->stack)
@@ -75,13 +80,17 @@ AsanThreadContext *GetThreadContextByTidLocked(u32 tid) {
 
 // AsanThread implementation.
 
-AsanThread *AsanThread::Create(thread_callback_t start_routine,
-                               void *arg) {
+AsanThread *AsanThread::Create(thread_callback_t start_routine, void *arg,
+                               u32 parent_tid, StackTrace *stack,
+                               bool detached) {
   uptr PageSize = GetPageSizeCached();
   uptr size = RoundUpTo(sizeof(AsanThread), PageSize);
   AsanThread *thread = (AsanThread*)MmapOrDie(size, __func__);
   thread->start_routine_ = start_routine;
   thread->arg_ = arg;
+  CreateThreadContextArgs args = { thread, stack };
+  asanThreadRegistry().CreateThread(*reinterpret_cast<uptr *>(thread), detached,
+                                    parent_tid, &args);
 
   return thread;
 }
index d9b210d..9da136c 100644 (file)
@@ -55,7 +55,8 @@ COMPILER_CHECK(sizeof(AsanThreadContext) <= 256);
 // AsanThread are stored in TSD and destroyed when the thread dies.
 class AsanThread {
  public:
-  static AsanThread *Create(thread_callback_t start_routine, void *arg);
+  static AsanThread *Create(thread_callback_t start_routine, void *arg,
+                            u32 parent_tid, StackTrace *stack, bool detached);
   static void TSDDtor(void *tsd);
   void Destroy();
 
@@ -167,11 +168,6 @@ class ScopedDeadlySignal {
   AsanThread *thread;
 };
 
-struct CreateThreadContextArgs {
-  AsanThread *thread;
-  StackTrace *stack;
-};
-
 // Returns a single instance of registry.
 ThreadRegistry &asanThreadRegistry();