diff options
| author | Tom Tromey | 2012-08-20 12:17:36 -0600 |
|---|---|---|
| committer | Tom Tromey | 2012-08-20 12:17:36 -0600 |
| commit | 68608de20310c42c5719fe99e556847fac9dd1f2 (patch) | |
| tree | b656eb2541a476f8f5afdbb710c61347e37bf864 /src | |
| parent | fb77afbe75308507885113a56017f095da8ba1cc (diff) | |
| download | emacs-68608de20310c42c5719fe99e556847fac9dd1f2.tar.gz emacs-68608de20310c42c5719fe99e556847fac9dd1f2.zip | |
pass the thread name to the OS if possible
use prctl to pass the thread name to the OS, if possible
Diffstat (limited to 'src')
| -rw-r--r-- | src/systhread.c | 16 | ||||
| -rw-r--r-- | src/systhread.h | 3 | ||||
| -rw-r--r-- | src/thread.c | 7 |
3 files changed, 21 insertions, 5 deletions
diff --git a/src/systhread.c b/src/systhread.c index 666641c24da..ab647528452 100644 --- a/src/systhread.c +++ b/src/systhread.c | |||
| @@ -24,6 +24,10 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 24 | 24 | ||
| 25 | #include <sched.h> | 25 | #include <sched.h> |
| 26 | 26 | ||
| 27 | #ifdef HAVE_SYS_PRCTL_H | ||
| 28 | #include <sys/prctl.h> | ||
| 29 | #endif | ||
| 30 | |||
| 27 | void | 31 | void |
| 28 | sys_mutex_init (sys_mutex_t *mutex) | 32 | sys_mutex_init (sys_mutex_t *mutex) |
| 29 | { | 33 | { |
| @@ -91,8 +95,8 @@ sys_thread_equal (sys_thread_t one, sys_thread_t two) | |||
| 91 | } | 95 | } |
| 92 | 96 | ||
| 93 | int | 97 | int |
| 94 | sys_thread_create (sys_thread_t *thread_ptr, thread_creation_function *func, | 98 | sys_thread_create (sys_thread_t *thread_ptr, const char *name, |
| 95 | void *arg) | 99 | thread_creation_function *func, void *arg) |
| 96 | { | 100 | { |
| 97 | pthread_attr_t attr; | 101 | pthread_attr_t attr; |
| 98 | int result = 0; | 102 | int result = 0; |
| @@ -101,7 +105,13 @@ sys_thread_create (sys_thread_t *thread_ptr, thread_creation_function *func, | |||
| 101 | return 0; | 105 | return 0; |
| 102 | 106 | ||
| 103 | if (!pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED)) | 107 | if (!pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED)) |
| 104 | result = pthread_create (thread_ptr, &attr, func, arg) == 0; | 108 | { |
| 109 | result = pthread_create (thread_ptr, &attr, func, arg) == 0; | ||
| 110 | #if defined (HAVE_SYS_PRCTL_H) && defined (HAVE_PRCTL) && defined (PR_SET_NAME) | ||
| 111 | if (result && name != NULL) | ||
| 112 | prctl (PR_SET_NAME, name); | ||
| 113 | #endif | ||
| 114 | } | ||
| 105 | 115 | ||
| 106 | pthread_attr_destroy (&attr); | 116 | pthread_attr_destroy (&attr); |
| 107 | 117 | ||
diff --git a/src/systhread.h b/src/systhread.h index 790b385b7ff..bbd242ab93c 100644 --- a/src/systhread.h +++ b/src/systhread.h | |||
| @@ -54,7 +54,8 @@ extern void sys_cond_destroy (sys_cond_t *); | |||
| 54 | extern sys_thread_t sys_thread_self (void); | 54 | extern sys_thread_t sys_thread_self (void); |
| 55 | extern int sys_thread_equal (sys_thread_t, sys_thread_t); | 55 | extern int sys_thread_equal (sys_thread_t, sys_thread_t); |
| 56 | 56 | ||
| 57 | extern int sys_thread_create (sys_thread_t *, thread_creation_function *, | 57 | extern int sys_thread_create (sys_thread_t *, const char *, |
| 58 | thread_creation_function *, | ||
| 58 | void *); | 59 | void *); |
| 59 | 60 | ||
| 60 | extern void sys_thread_yield (void); | 61 | extern void sys_thread_yield (void); |
diff --git a/src/thread.c b/src/thread.c index dba84fd0fb6..01d2fd0d6eb 100644 --- a/src/thread.c +++ b/src/thread.c | |||
| @@ -23,6 +23,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 23 | #include "character.h" | 23 | #include "character.h" |
| 24 | #include "buffer.h" | 24 | #include "buffer.h" |
| 25 | #include "process.h" | 25 | #include "process.h" |
| 26 | #include "coding.h" | ||
| 26 | 27 | ||
| 27 | static struct thread_state primary_thread; | 28 | static struct thread_state primary_thread; |
| 28 | 29 | ||
| @@ -682,6 +683,7 @@ If NAME is given, it names the new thread. */) | |||
| 682 | sys_thread_t thr; | 683 | sys_thread_t thr; |
| 683 | struct thread_state *new_thread; | 684 | struct thread_state *new_thread; |
| 684 | Lisp_Object result; | 685 | Lisp_Object result; |
| 686 | const char *c_name = NULL; | ||
| 685 | 687 | ||
| 686 | /* Can't start a thread in temacs. */ | 688 | /* Can't start a thread in temacs. */ |
| 687 | if (!initialized) | 689 | if (!initialized) |
| @@ -716,7 +718,10 @@ If NAME is given, it names the new thread. */) | |||
| 716 | new_thread->next_thread = all_threads; | 718 | new_thread->next_thread = all_threads; |
| 717 | all_threads = new_thread; | 719 | all_threads = new_thread; |
| 718 | 720 | ||
| 719 | if (! sys_thread_create (&thr, run_thread, new_thread)) | 721 | if (!NILP (name)) |
| 722 | c_name = SSDATA (ENCODE_UTF_8 (name)); | ||
| 723 | |||
| 724 | if (! sys_thread_create (&thr, c_name, run_thread, new_thread)) | ||
| 720 | { | 725 | { |
| 721 | /* Restore the previous situation. */ | 726 | /* Restore the previous situation. */ |
| 722 | all_threads = all_threads->next_thread; | 727 | all_threads = all_threads->next_thread; |