summaryrefslogtreecommitdiffstats
path: root/src/pulsecore/thread-posix.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-05-03 13:28:15 +0200
committerLennart Poettering <lennart@poettering.net>2010-05-07 23:58:59 +0200
commitcdc2769162c7e4d4bbab0b221829c0caca31c43d (patch)
tree27d11febd0da4fc61d8bcd545e66a862abd390b4 /src/pulsecore/thread-posix.c
parent5248a584a36d49b745c1891954e9aa5e689e89a2 (diff)
thread: name all threads so that the names appear in /proc/$PID/task/$TID/comm
Diffstat (limited to 'src/pulsecore/thread-posix.c')
-rw-r--r--src/pulsecore/thread-posix.c48
1 files changed, 46 insertions, 2 deletions
diff --git a/src/pulsecore/thread-posix.c b/src/pulsecore/thread-posix.c
index bc0d6e33..7d5252d6 100644
--- a/src/pulsecore/thread-posix.c
+++ b/src/pulsecore/thread-posix.c
@@ -28,6 +28,10 @@
#include <sched.h>
#include <errno.h>
+#ifdef __linux__
+#include <sys/prctl.h>
+#endif
+
#include <pulse/xmalloc.h>
#include <pulsecore/mutex.h>
#include <pulsecore/once.h>
@@ -42,6 +46,7 @@ struct pa_thread {
void *userdata;
pa_atomic_t running;
pa_bool_t joined;
+ char *name;
};
struct pa_tls {
@@ -53,9 +58,11 @@ static void thread_free_cb(void *p) {
pa_assert(t);
- if (!t->thread_func)
+ if (!t->thread_func) {
/* This is a foreign thread, we need to free the struct */
+ pa_xfree(t->name);
pa_xfree(t);
+ }
}
PA_STATIC_TLS_DECLARE(current_thread, thread_free_cb);
@@ -64,6 +71,10 @@ static void* internal_thread_func(void *userdata) {
pa_thread *t = userdata;
pa_assert(t);
+#ifdef __linux__
+ prctl(PR_SET_NAME, t->name);
+#endif
+
t->id = pthread_self();
PA_STATIC_TLS_SET(current_thread, t);
@@ -75,12 +86,13 @@ static void* internal_thread_func(void *userdata) {
return NULL;
}
-pa_thread* pa_thread_new(pa_thread_func_t thread_func, void *userdata) {
+pa_thread* pa_thread_new(const char *name, pa_thread_func_t thread_func, void *userdata) {
pa_thread *t;
pa_assert(thread_func);
t = pa_xnew0(pa_thread, 1);
+ t->name = pa_xstrdup(name);
t->thread_func = thread_func;
t->userdata = userdata;
@@ -110,6 +122,8 @@ void pa_thread_free(pa_thread *t) {
pa_assert(t);
pa_thread_join(t);
+
+ pa_xfree(t->name);
pa_xfree(t);
}
@@ -155,6 +169,36 @@ void pa_thread_set_data(pa_thread *t, void *userdata) {
t->userdata = userdata;
}
+void pa_thread_set_name(pa_thread *t, const char *name) {
+ pa_assert(t);
+
+ pa_xfree(t->name);
+ t->name = pa_xstrdup(name);
+
+#ifdef __linux__
+ prctl(PR_SET_NAME, name);
+#endif
+}
+
+const char *pa_thread_get_name(pa_thread *t) {
+ pa_assert(t);
+
+#ifdef __linux__
+ if (!t->name) {
+ t->name = pa_xmalloc(17);
+
+ if (prctl(PR_GET_NAME, t->name) >= 0)
+ t->name[16] = 0;
+ else {
+ pa_xfree(t->name);
+ t->name = NULL;
+ }
+ }
+#endif
+
+ return t->name;
+}
+
void pa_thread_yield(void) {
#ifdef HAVE_PTHREAD_YIELD
pthread_yield();