In fact this is still incorrect if a thread is started in a suspended state, which is not rare on Windows.<br><br><div class="gmail_quote">On Fri Dec 05 2014 at 7:57:22 PM Sergey Matveev <<a href="mailto:earthdok@google.com">earthdok@google.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: smatveev<br>
Date: Fri Dec  5 10:53:58 2014<br>
New Revision: 223477<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=223477&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=223477&view=rev</a><br>
Log:<br>
[ASan] Fix Win build following r223419.<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/<u></u>asan_interceptors.cc<br>
<br>
Modified: compiler-rt/trunk/lib/asan/<u></u>asan_interceptors.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interceptors.cc?rev=223477&r1=223476&r2=223477&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/compiler-rt/trunk/lib/<u></u>asan/asan_interceptors.cc?rev=<u></u>223477&r1=223476&r2=223477&<u></u>view=diff</a><br>
==============================<u></u>==============================<u></u>==================<br>
--- compiler-rt/trunk/lib/asan/<u></u>asan_interceptors.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/<u></u>asan_interceptors.cc Fri Dec  5 10:53:58 2014<br>
@@ -731,13 +731,25 @@ INTERCEPTOR_WINAPI(DWORD, CreateThread,<br>
   if (flags()->strict_init_order)<br>
     StopInitOrderChecking();<br>
   GET_STACK_TRACE_THREAD;<br>
-  u32 current_tid = GetCurrentTidOrInvalid();<br>
-  AsanThread *t = AsanThread::Create(start_<u></u>routine, arg);<br>
-  CreateThreadContextArgs args = { t, &stack };<br>
   bool detached = false;  // FIXME: how can we determine it on Windows?<br>
-  asanThreadRegistry().<u></u>CreateThread(*(uptr*)t, detached, current_tid, &args);<br>
-  return REAL(CreateThread)(security, stack_size,<br>
-                            asan_thread_start, t, thr_flags, tid);<br>
+  ThreadStartParam param;<br>
+  atomic_store(&param.t, 0, memory_order_relaxed);<br>
+  atomic_store(&param.is_<u></u>registered, 0, memory_order_relaxed);<br>
+  DWORD result = REAL(CreateThread)(security, stack_size, asan_thread_start,<br>
+                                    &param, thr_flags, tid);<br>
+  if (result) {<br>
+    u32 current_tid = GetCurrentTidOrInvalid();<br>
+    AsanThread *t = AsanThread::Create(start_<u></u>routine, arg);<br>
+    CreateThreadContextArgs args = { t, &stack };<br>
+    asanThreadRegistry().<u></u>CreateThread(*reinterpret_<u></u>cast<uptr *>(t), detached,<br>
+                                      current_tid, &args);<br>
+    atomic_store(&param.t, reinterpret_cast<uptr>(t), memory_order_release);<br>
+    // The pthread_create interceptor waits here, so we do the same for<br>
+    // consistency.<br>
+    while (atomic_load(&param.is_<u></u>registered, memory_order_acquire) == 0)<br>
+      internal_sched_yield();<br>
+  }<br>
+  return result;<br>
 }<br>
<br>
 namespace __asan {<br>
<br>
<br>
______________________________<u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/llvm-commits</a><br>
</blockquote></div>