diff options
Diffstat (limited to 'src/pulsecore')
-rw-r--r-- | src/pulsecore/lock-autospawn.c | 2 | ||||
-rw-r--r-- | src/pulsecore/thread-posix.c | 48 | ||||
-rw-r--r-- | src/pulsecore/thread.h | 5 |
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); |