Bug 1347007 - Register with the profiler after doing so for the ThreadManager. r=njn draft
authorBlake Kaplan <mrbkap@gmail.com>
Mon, 13 Mar 2017 15:03:24 -0700
changeset 497947 57ea9153ff4dea7f39986af3e1b9be2ee21762c2
parent 497875 6d38ad302429c98115c354d643e81987ecec5d3c
child 549044 84f077992a7009e461424489a234edcad141b8fc
push id49068
push userbmo:mrbkap@mozilla.com
push dateTue, 14 Mar 2017 03:08:22 +0000
reviewersnjn
bugs1347007
milestone55.0a1
Bug 1347007 - Register with the profiler after doing so for the ThreadManager. r=njn MozReview-Commit-ID: 6gtDxmlgOta
xpcom/threads/nsThread.cpp
--- a/xpcom/threads/nsThread.cpp
+++ b/xpcom/threads/nsThread.cpp
@@ -455,27 +455,32 @@ nsThread::ThreadFunc(void* aArg)
   char stackTop;
 
   ThreadInitData* initData = static_cast<ThreadInitData*>(aArg);
   nsThread* self = initData->thread;  // strong reference
 
   self->mThread = PR_GetCurrentThread();
   SetupCurrentThreadForChaosMode();
 
-  if (initData->name.Length() > 0) {
+  if (!initData->name.IsEmpty()) {
     PR_SetCurrentThreadName(initData->name.BeginReading());
-
-    profiler_register_thread(initData->name.BeginReading(), &stackTop);
   }
 
   // Inform the ThreadManager
   nsThreadManager::get().RegisterCurrentThread(*self);
 
   mozilla::IOInterposer::RegisterCurrentThread();
 
+  // This must come after the call to nsThreadManager::RegisterCurrentThread(),
+  // because that call is needed to properly set up this thread as an nsThread,
+  // which profiler_register_thread() requires. See bug 1347007.
+  if (!initData->name.IsEmpty()) {
+    profiler_register_thread(initData->name.BeginReading(), &stackTop);
+  }
+
   // Wait for and process startup event
   nsCOMPtr<nsIRunnable> event;
   {
     MutexAutoLock lock(self->mLock);
     if (!self->mEvents->GetEvent(true, getter_AddRefs(event), lock)) {
       NS_WARNING("failed waiting for thread startup event");
       return;
     }