summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/thread
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2007-04-23 03:36:14 +0000
committerdeischen <deischen@FreeBSD.org>2007-04-23 03:36:14 +0000
commit5e5a32d1393ff28580fb207101562d4bb12efd78 (patch)
tree8aabeae41b9b83219067a3a40d2419371782e011 /lib/libpthread/thread
parent9172c87258d3b52611432fb3ac3537c198fbad53 (diff)
downloadFreeBSD-src-5e5a32d1393ff28580fb207101562d4bb12efd78.zip
FreeBSD-src-5e5a32d1393ff28580fb207101562d4bb12efd78.tar.gz
Add a reference and lock the target thread when setting its name.
Submitted by: davidxu (via libthr)
Diffstat (limited to 'lib/libpthread/thread')
-rw-r--r--lib/libpthread/thread/thr_info.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/lib/libpthread/thread/thr_info.c b/lib/libpthread/thread/thr_info.c
index 1028ca7..e8dc506 100644
--- a/lib/libpthread/thread/thr_info.c
+++ b/lib/libpthread/thread/thr_info.c
@@ -214,12 +214,31 @@ dump_thread(int fd, pthread_t pthread, int long_version)
void
_pthread_set_name_np(pthread_t thread, char *name)
{
- /* Check if the caller has specified a valid thread: */
- if (thread != NULL && thread->magic == THR_MAGIC) {
- if (thread->name != NULL) {
+ struct pthread *curthread = _get_curthread();
+ char *new_name;
+ char *prev_name;
+ int ret;
+
+ new_name = strdup(name);
+ /* Add a reference to the target thread. */
+ if (_thr_ref_add(curthread, thread, 0) != 0) {
+ free(new_name);
+ ret = ESRCH;
+ }
+ else {
+ THR_THREAD_LOCK(curthread, thread);
+ prev_name = thread->name;
+ thread->name = new_name;
+ THR_THREAD_UNLOCK(curthread, thread);
+ _thr_ref_delete(curthread, thread);
+ if (prev_name != NULL) {
/* Free space for previous name. */
- free(thread->name);
+ free(prev_name);
}
- thread->name = strdup(name);
+ ret = 0;
}
+#if 0
+ /* XXX - Should return error code. */
+ return (ret);
+#endif
}
OpenPOWER on IntegriCloud