[standalone] Name dart:io threads.
Change-Id: I5f5248366b39afab96a8b70b4f107ec5134b84f4
Reviewed-on: https://dart-review.googlesource.com/c/92960
Reviewed-by: Zach Anderson <zra@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index a6bd764..10e4818 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -401,8 +401,9 @@
}
void EventHandlerImplementation::Start(EventHandler* handler) {
- int result = Thread::Start(&EventHandlerImplementation::Poll,
- reinterpret_cast<uword>(handler));
+ int result =
+ Thread::Start("dart:io EventHandler", &EventHandlerImplementation::Poll,
+ reinterpret_cast<uword>(handler));
if (result != 0) {
FATAL1("Failed to start event handler thread %d", result);
}
diff --git a/runtime/bin/eventhandler_fuchsia.cc b/runtime/bin/eventhandler_fuchsia.cc
index a74f0c2..1b4769b 100644
--- a/runtime/bin/eventhandler_fuchsia.cc
+++ b/runtime/bin/eventhandler_fuchsia.cc
@@ -553,8 +553,9 @@
}
void EventHandlerImplementation::Start(EventHandler* handler) {
- int result = Thread::Start(&EventHandlerImplementation::Poll,
- reinterpret_cast<uword>(handler));
+ int result =
+ Thread::Start("dart:io EventHandler", &EventHandlerImplementation::Poll,
+ reinterpret_cast<uword>(handler));
if (result != 0) {
FATAL1("Failed to start event handler thread %d", result);
}
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index d02a49e..1a4283f 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -405,8 +405,9 @@
}
void EventHandlerImplementation::Start(EventHandler* handler) {
- int result = Thread::Start(&EventHandlerImplementation::Poll,
- reinterpret_cast<uword>(handler));
+ int result =
+ Thread::Start("dart:io EventHandler", &EventHandlerImplementation::Poll,
+ reinterpret_cast<uword>(handler));
if (result != 0) {
FATAL1("Failed to start event handler thread %d", result);
}
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 04abaac..052e746 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -464,7 +464,8 @@
}
void EventHandlerImplementation::Start(EventHandler* handler) {
- int result = Thread::Start(&EventHandlerImplementation::EventHandlerEntry,
+ int result = Thread::Start("dart:io EventHandler",
+ &EventHandlerImplementation::EventHandlerEntry,
reinterpret_cast<uword>(handler));
if (result != 0) {
FATAL1("Failed to start event handler thread %d", result);
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index 7b73b7e..e328f72 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -301,7 +301,8 @@
// Completing asynchronously through thread.
pending_read_ = buffer;
read_thread_starting_ = true;
- int result = Thread::Start(ReadFileThread, reinterpret_cast<uword>(this));
+ int result = Thread::Start("dart:io ReadFile", ReadFileThread,
+ reinterpret_cast<uword>(this));
if (result != 0) {
FATAL1("Failed to start read file thread %d", result);
}
@@ -781,7 +782,8 @@
// the events it puts on the IO completion port. The reference is
// Released by DeleteIfClosed.
Retain();
- int result = Thread::Start(WriteFileThread, reinterpret_cast<uword>(this));
+ int result = Thread::Start("dart:io WriteFile", WriteFileThread,
+ reinterpret_cast<uword>(this));
if (result != 0) {
FATAL1("Failed to start write file thread %d", result);
}
@@ -1460,8 +1462,8 @@
}
void EventHandlerImplementation::Start(EventHandler* handler) {
- int result =
- Thread::Start(EventHandlerEntry, reinterpret_cast<uword>(handler));
+ int result = Thread::Start("dart:io EventHandler", EventHandlerEntry,
+ reinterpret_cast<uword>(handler));
if (result != 0) {
FATAL1("Failed to start event handler thread %d", result);
}
diff --git a/runtime/bin/file_system_watcher_macos.cc b/runtime/bin/file_system_watcher_macos.cc
index 53ca879..635a8d1 100644
--- a/runtime/bin/file_system_watcher_macos.cc
+++ b/runtime/bin/file_system_watcher_macos.cc
@@ -178,7 +178,7 @@
FSEventsWatcher() : run_loop_(0) { Start(); }
void Start() {
- Thread::Start(Run, reinterpret_cast<uword>(this));
+ Thread::Start("dart:io FileWatcher", Run, reinterpret_cast<uword>(this));
monitor_.Enter();
while (run_loop_ == NULL) {
monitor_.Wait(Monitor::kNoTimeout);
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index d379d2d..e23dadd 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -141,7 +141,8 @@
}
// Start thread that handles process exits when wait returns.
- int result = Thread::Start(ExitCodeHandlerEntry, 0);
+ int result =
+ Thread::Start("dart:io Process.start", ExitCodeHandlerEntry, 0);
if (result != 0) {
FATAL1("Failed to start exit code handler worker thread %d", result);
}
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index 6fd29a0..ac15292 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -167,7 +167,8 @@
}
// Start thread that handles process exits when wait returns.
- intptr_t result = Thread::Start(ExitCodeHandlerEntry, 0);
+ intptr_t result =
+ Thread::Start("dart:io Process.start", ExitCodeHandlerEntry, 0);
if (result != 0) {
FATAL1("Failed to start exit code handler worker thread %ld", result);
}
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index 825bc1d..6dfc3aa 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -141,7 +141,8 @@
}
// Start thread that handles process exits when wait returns.
- int result = Thread::Start(ExitCodeHandlerEntry, 0);
+ int result =
+ Thread::Start("dart:io Process.start", ExitCodeHandlerEntry, 0);
if (result != 0) {
FATAL1("Failed to start exit code handler worker thread %d", result);
}
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index d83443a..e8cb286 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -140,7 +140,8 @@
}
// Start thread that handles process exits when wait returns.
- int result = Thread::Start(ExitCodeHandlerEntry, 0);
+ int result =
+ Thread::Start("dart:io Process.start", ExitCodeHandlerEntry, 0);
if (result != 0) {
FATAL1("Failed to start exit code handler worker thread %d", result);
}
diff --git a/runtime/bin/thread.h b/runtime/bin/thread.h
index 8e31cb6..09c9743 100644
--- a/runtime/bin/thread.h
+++ b/runtime/bin/thread.h
@@ -43,7 +43,9 @@
// Start a thread running the specified function. Returns 0 if the
// thread started successfuly and a system specific error code if
// the thread failed to start.
- static int Start(ThreadStartFunction function, uword parameters);
+ static int Start(const char* name,
+ ThreadStartFunction function,
+ uword parameters);
static ThreadLocalKey CreateThreadLocal();
static void DeleteThreadLocal(ThreadLocalKey key);
diff --git a/runtime/bin/thread_android.cc b/runtime/bin/thread_android.cc
index 4970240..2bef99c 100644
--- a/runtime/bin/thread_android.cc
+++ b/runtime/bin/thread_android.cc
@@ -58,13 +58,17 @@
class ThreadStartData {
public:
- ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
- : function_(function), parameter_(parameter) {}
+ ThreadStartData(const char* name,
+ Thread::ThreadStartFunction function,
+ uword parameter)
+ : name_(name), function_(function), parameter_(parameter) {}
+ const char* name() const { return name_; }
Thread::ThreadStartFunction function() const { return function_; }
uword parameter() const { return parameter_; }
private:
+ const char* name_;
Thread::ThreadStartFunction function_;
uword parameter_;
@@ -77,17 +81,23 @@
static void* ThreadStart(void* data_ptr) {
ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
+ const char* name = data->name();
Thread::ThreadStartFunction function = data->function();
uword parameter = data->parameter();
delete data;
+ // Set the thread name.
+ pthread_setname_np(pthread_self(), name);
+
// Call the supplied thread start function handing it its parameters.
function(parameter);
return NULL;
}
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int Thread::Start(const char* name,
+ ThreadStartFunction function,
+ uword parameter) {
pthread_attr_t attr;
int result = pthread_attr_init(&attr);
RETURN_ON_PTHREAD_FAILURE(result);
@@ -98,7 +108,7 @@
result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
RETURN_ON_PTHREAD_FAILURE(result);
- ThreadStartData* data = new ThreadStartData(function, parameter);
+ ThreadStartData* data = new ThreadStartData(name, function, parameter);
pthread_t tid;
result = pthread_create(&tid, &attr, ThreadStart, data);
diff --git a/runtime/bin/thread_fuchsia.cc b/runtime/bin/thread_fuchsia.cc
index 793e9c1..d71a1df 100644
--- a/runtime/bin/thread_fuchsia.cc
+++ b/runtime/bin/thread_fuchsia.cc
@@ -8,8 +8,12 @@
#include "bin/thread.h"
#include "bin/thread_fuchsia.h"
-#include <errno.h> // NOLINT
-#include <sys/time.h> // NOLINT
+#include <errno.h> // NOLINT
+#include <sys/time.h> // NOLINT
+#include <zircon/status.h>
+#include <zircon/syscalls.h>
+#include <zircon/threads.h>
+#include <zircon/types.h>
#include "platform/assert.h"
#include "platform/utils.h"
@@ -57,13 +61,17 @@
class ThreadStartData {
public:
- ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
- : function_(function), parameter_(parameter) {}
+ ThreadStartData(const char* name,
+ Thread::ThreadStartFunction function,
+ uword parameter)
+ : name_(name), function_(function), parameter_(parameter) {}
+ const char* name() const { return name_; }
Thread::ThreadStartFunction function() const { return function_; }
uword parameter() const { return parameter_; }
private:
+ const char* name_;
Thread::ThreadStartFunction function_;
uword parameter_;
@@ -76,17 +84,24 @@
static void* ThreadStart(void* data_ptr) {
ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
+ const char* name = data->name();
Thread::ThreadStartFunction function = data->function();
uword parameter = data->parameter();
delete data;
+ // Set the thread name.
+ zx_handle_t thread_handle = thrd_get_zx_handle(thrd_current());
+ zx_object_set_property(thread_handle, ZX_PROP_NAME, name, strlen(name) + 1);
+
// Call the supplied thread start function handing it its parameters.
function(parameter);
return NULL;
}
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int Thread::Start(const char* name,
+ ThreadStartFunction function,
+ uword parameter) {
pthread_attr_t attr;
int result = pthread_attr_init(&attr);
RETURN_ON_PTHREAD_FAILURE(result);
@@ -97,7 +112,7 @@
result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
RETURN_ON_PTHREAD_FAILURE(result);
- ThreadStartData* data = new ThreadStartData(function, parameter);
+ ThreadStartData* data = new ThreadStartData(name, function, parameter);
pthread_t tid;
result = pthread_create(&tid, &attr, ThreadStart, data);
diff --git a/runtime/bin/thread_linux.cc b/runtime/bin/thread_linux.cc
index 1140ed4..2b3a7e6 100644
--- a/runtime/bin/thread_linux.cc
+++ b/runtime/bin/thread_linux.cc
@@ -58,13 +58,17 @@
class ThreadStartData {
public:
- ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
- : function_(function), parameter_(parameter) {}
+ ThreadStartData(const char* name,
+ Thread::ThreadStartFunction function,
+ uword parameter)
+ : name_(name), function_(function), parameter_(parameter) {}
+ const char* name() const { return name_; }
Thread::ThreadStartFunction function() const { return function_; }
uword parameter() const { return parameter_; }
private:
+ const char* name_;
Thread::ThreadStartFunction function_;
uword parameter_;
@@ -77,17 +81,23 @@
static void* ThreadStart(void* data_ptr) {
ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
+ const char* name = data->name();
Thread::ThreadStartFunction function = data->function();
uword parameter = data->parameter();
delete data;
+ // Set the thread name.
+ pthread_setname_np(pthread_self(), name);
+
// Call the supplied thread start function handing it its parameters.
function(parameter);
return NULL;
}
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int Thread::Start(const char* name,
+ ThreadStartFunction function,
+ uword parameter) {
pthread_attr_t attr;
int result = pthread_attr_init(&attr);
RETURN_ON_PTHREAD_FAILURE(result);
@@ -98,7 +108,7 @@
result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
RETURN_ON_PTHREAD_FAILURE(result);
- ThreadStartData* data = new ThreadStartData(function, parameter);
+ ThreadStartData* data = new ThreadStartData(name, function, parameter);
pthread_t tid;
result = pthread_create(&tid, &attr, ThreadStart, data);
diff --git a/runtime/bin/thread_macos.cc b/runtime/bin/thread_macos.cc
index 6618ba8..d9ebb5e 100644
--- a/runtime/bin/thread_macos.cc
+++ b/runtime/bin/thread_macos.cc
@@ -52,13 +52,17 @@
class ThreadStartData {
public:
- ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
- : function_(function), parameter_(parameter) {}
+ ThreadStartData(const char* name,
+ Thread::ThreadStartFunction function,
+ uword parameter)
+ : name_(name), function_(function), parameter_(parameter) {}
+ const char* name() const { return name_; }
Thread::ThreadStartFunction function() const { return function_; }
uword parameter() const { return parameter_; }
private:
+ const char* name_;
Thread::ThreadStartFunction function_;
uword parameter_;
@@ -71,17 +75,23 @@
static void* ThreadStart(void* data_ptr) {
ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
+ const char* name = data->name();
Thread::ThreadStartFunction function = data->function();
uword parameter = data->parameter();
delete data;
+ // Set the thread name.
+ pthread_setname_np(pthread_self(), name);
+
// Call the supplied thread start function handing it its parameters.
function(parameter);
return NULL;
}
-int Thread::Start(ThreadStartFunction function, uword parameter) {
+int Thread::Start(const char* name,
+ ThreadStartFunction function,
+ uword parameter) {
pthread_attr_t attr;
int result = pthread_attr_init(&attr);
RETURN_ON_PTHREAD_FAILURE(result);
@@ -92,7 +102,7 @@
result = pthread_attr_setstacksize(&attr, Thread::GetMaxStackSize());
RETURN_ON_PTHREAD_FAILURE(result);
- ThreadStartData* data = new ThreadStartData(function, parameter);
+ ThreadStartData* data = new ThreadStartData(name, function, parameter);
pthread_t tid;
result = pthread_create(&tid, &attr, ThreadStart, data);
diff --git a/runtime/bin/thread_win.cc b/runtime/bin/thread_win.cc
index cba3652..402deba 100644
--- a/runtime/bin/thread_win.cc
+++ b/runtime/bin/thread_win.cc
@@ -17,13 +17,17 @@
class ThreadStartData {
public:
- ThreadStartData(Thread::ThreadStartFunction function, uword parameter)
- : function_(function), parameter_(parameter) {}
+ ThreadStartData(const char* name,
+ Thread::ThreadStartFunction function,
+ uword parameter)
+ : name_(name), function_(function), parameter_(parameter) {}
+ const char* name() const { return name_; }
Thread::ThreadStartFunction function() const { return function_; }
uword parameter() const { return parameter_; }
private:
+ const char* name_;
Thread::ThreadStartFunction function_;
uword parameter_;
@@ -36,18 +40,24 @@
static unsigned int __stdcall ThreadEntry(void* data_ptr) {
ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
+ const char* name = data->name();
Thread::ThreadStartFunction function = data->function();
uword parameter = data->parameter();
delete data;
+ // Set the thread name.
+ SetThreadDescription(GetCurrentThread(), reinterpret_cast<PCWSTR>(name));
+
// Call the supplied thread start function handing it its parameters.
function(parameter);
return 0;
}
-int Thread::Start(ThreadStartFunction function, uword parameter) {
- ThreadStartData* start_data = new ThreadStartData(function, parameter);
+int Thread::Start(const char* name,
+ ThreadStartFunction function,
+ uword parameter) {
+ ThreadStartData* start_data = new ThreadStartData(name, function, parameter);
uint32_t tid;
uintptr_t thread = _beginthreadex(NULL, Thread::GetMaxStackSize(),
ThreadEntry, start_data, 0, &tid);
diff --git a/runtime/vm/os_thread_android.cc b/runtime/vm/os_thread_android.cc
index e03d9b7..093795d 100644
--- a/runtime/vm/os_thread_android.cc
+++ b/runtime/vm/os_thread_android.cc
@@ -119,6 +119,9 @@
uword parameter = data->parameter();
delete data;
+ // Set the thread name.
+ pthread_setname_np(pthread_self(), name);
+
// Create new OSThread object and set as TLS for new thread.
OSThread* thread = OSThread::CreateOSThread();
if (thread != NULL) {
diff --git a/runtime/vm/os_thread_fuchsia.cc b/runtime/vm/os_thread_fuchsia.cc
index b465e07..d6fd956 100644
--- a/runtime/vm/os_thread_fuchsia.cc
+++ b/runtime/vm/os_thread_fuchsia.cc
@@ -12,9 +12,7 @@
#include <errno.h> // NOLINT
#include <zircon/status.h>
#include <zircon/syscalls.h>
-#include <zircon/syscalls/object.h>
#include <zircon/threads.h>
-#include <zircon/tls.h>
#include <zircon/types.h>
#include "platform/address_sanitizer.h"
diff --git a/runtime/vm/os_thread_linux.cc b/runtime/vm/os_thread_linux.cc
index 8c9fa0f..0003ee2 100644
--- a/runtime/vm/os_thread_linux.cc
+++ b/runtime/vm/os_thread_linux.cc
@@ -121,6 +121,9 @@
uword parameter = data->parameter();
delete data;
+ // Set the thread name.
+ pthread_setname_np(pthread_self(), name);
+
// Create new OSThread object and set as TLS for new thread.
OSThread* thread = OSThread::CreateOSThread();
if (thread != NULL) {
diff --git a/runtime/vm/os_thread_macos.cc b/runtime/vm/os_thread_macos.cc
index 0fff6fd..7cf3923 100644
--- a/runtime/vm/os_thread_macos.cc
+++ b/runtime/vm/os_thread_macos.cc
@@ -97,6 +97,9 @@
uword parameter = data->parameter();
delete data;
+ // Set the thread name.
+ pthread_setname_np(pthread_self(), name);
+
// Create new OSThread object and set as TLS for new thread.
OSThread* thread = OSThread::CreateOSThread();
if (thread != NULL) {
diff --git a/runtime/vm/os_thread_win.cc b/runtime/vm/os_thread_win.cc
index b1aed90..7ef96fa 100644
--- a/runtime/vm/os_thread_win.cc
+++ b/runtime/vm/os_thread_win.cc
@@ -51,6 +51,9 @@
uword parameter = data->parameter();
delete data;
+ // Set the thread name.
+ SetThreadDescription(GetCurrentThread(), reinterpret_cast<PCWSTR>(name));
+
// Create new OSThread object and set as TLS for new thread.
OSThread* thread = OSThread::CreateOSThread();
if (thread != NULL) {