summaryrefslogtreecommitdiff
path: root/src/pulsecore
diff options
context:
space:
mode:
Diffstat (limited to 'src/pulsecore')
-rw-r--r--src/pulsecore/lock-autospawn.c2
-rw-r--r--src/pulsecore/thread-posix.c48
-rw-r--r--src/pulsecore/thread.h5
3 files changed, 51 insertions, 4 deletions
diff --git a/src/pulsecore/lock-autospawn.c b/src/pulsecore/lock-autospawn.c
index 95ca04a8e..422f5eb28 100644
--- a/src/pulsecore/lock-autospawn.c
+++ b/src/pulsecore/lock-autospawn.c
@@ -244,7 +244,7 @@ finish:
static int start_thread(void) {
if (!thread)
- if (!(thread = pa_thread_new(thread_func, NULL)))
+ if (!(thread = pa_thread_new("autospawn", thread_func, NULL)))
return -1;
return 0;
diff --git a/src/pulsecore/thread-posix.c b/src/pulsecore/thread-posix.c
index bc0d6e334..7d5252d68 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();
diff --git a/src/pulsecore/thread.h b/src/pulsecore/thread.h
index 60c1267b5..aea027641 100644
--- a/src/pulsecore/thread.h
+++ b/src/pulsecore/thread.h
@@ -35,7 +35,7 @@ typedef struct pa_thread pa_thread;
typedef void (*pa_thread_func_t) (void *userdata);
-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);
void pa_thread_free(pa_thread *t);
int pa_thread_join(pa_thread *t);
int pa_thread_is_running(pa_thread *t);
@@ -45,6 +45,9 @@ void pa_thread_yield(void);
void* pa_thread_get_data(pa_thread *t);
void pa_thread_set_data(pa_thread *t, void *userdata);
+const char *pa_thread_get_name(pa_thread *t);
+void pa_thread_set_name(pa_thread *t, const char *name);
+
typedef struct pa_tls pa_tls;
pa_tls* pa_tls_new(pa_free_cb_t free_cb);