diff options
author | Dave MacLachlan <dmaclach@gmail.com> | 2017-11-29 16:25:10 -0800 |
---|---|---|
committer | Dave MacLachlan <dmaclach@gmail.com> | 2017-11-29 16:25:10 -0800 |
commit | af5c54de9cdf3a8ac27aa428571d98a93f32cc1f (patch) | |
tree | 5ba4015c5d815aa9652efe44e95d6afd9b430090 /src/core/lib/support | |
parent | c99a3ca415fcf5581f9c365e4dc3004e858fc76a (diff) |
Add thread naming support on platforms that support it.
As a client of grpc I want to be aware of which threads are being
created by grpc, and giving them recognizable names makes it significantly
easier to diagnose what is going on in my programs.
This provides thread names for macOS and Linux. Adding support for other
platforms should be easy for platform specialists.
Diffstat (limited to 'src/core/lib/support')
-rw-r--r-- | src/core/lib/support/thd_posix.cc | 19 | ||||
-rw-r--r-- | src/core/lib/support/thd_windows.cc | 3 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/core/lib/support/thd_posix.cc b/src/core/lib/support/thd_posix.cc index 02e3846be1..ae31a17990 100644 --- a/src/core/lib/support/thd_posix.cc +++ b/src/core/lib/support/thd_posix.cc @@ -33,17 +33,31 @@ struct thd_arg { void (*body)(void* arg); /* body of a thread */ void* arg; /* argument to a thread */ + const char* name; /* name of thread */ }; /* Body of every thread started via gpr_thd_new. */ static void* thread_body(void* v) { struct thd_arg a = *(struct thd_arg*)v; free(v); + if (a.name != NULL) { +#if GPR_APPLE_PTHREAD_NAME + /* Apple supports 64 characters, and will truncate if it's longer. */ + pthread_setname_np(a.name); +#elif GPR_LINUX_PTHREAD_NAME + /* Linux supports 16 characters max, and will error if it's longer. */ + char buf[16]; + strncpy(buf, a.name, sizeof(buf) - 1); + buf[sizeof(buf) - 1] = '\0'; + pthread_setname_np(pthread_self(), buf); +#endif // GPR_APPLE_PTHREAD_NAME + } (*a.body)(a.arg); return nullptr; } -int gpr_thd_new(gpr_thd_id* t, void (*thd_body)(void* arg), void* arg, +int gpr_thd_new(gpr_thd_id* t, const char* thd_name, + void (*thd_body)(void* arg), void* arg, const gpr_thd_options* options) { int thread_started; pthread_attr_t attr; @@ -54,7 +68,8 @@ int gpr_thd_new(gpr_thd_id* t, void (*thd_body)(void* arg), void* arg, GPR_ASSERT(a != nullptr); a->body = thd_body; a->arg = arg; - + a->name = thd_name; + GPR_ASSERT(pthread_attr_init(&attr) == 0); if (gpr_thd_options_is_detached(options)) { GPR_ASSERT(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == diff --git a/src/core/lib/support/thd_windows.cc b/src/core/lib/support/thd_windows.cc index 5bda7f440c..b54d0b6c62 100644 --- a/src/core/lib/support/thd_windows.cc +++ b/src/core/lib/support/thd_windows.cc @@ -63,7 +63,8 @@ static DWORD WINAPI thread_body(void* v) { return 0; } -int gpr_thd_new(gpr_thd_id* t, void (*thd_body)(void* arg), void* arg, +int gpr_thd_new(gpr_thd_id* t, const char* thd_name, + void (*thd_body)(void* arg), void* arg, const gpr_thd_options* options) { HANDLE handle; struct thd_info* info = (struct thd_info*)gpr_malloc(sizeof(*info)); |