diff --git a/userspace/libraries/LibC/include/bits/types/uthread.h b/userspace/libraries/LibC/include/bits/types/uthread.h index c0329591..704ce610 100644 --- a/userspace/libraries/LibC/include/bits/types/uthread.h +++ b/userspace/libraries/LibC/include/bits/types/uthread.h @@ -48,6 +48,7 @@ struct uthread // LIBC pid_t id; pthread_attr_t attr; + char name[16]; int errno_; int libc_owns_stack; int cancel_type; diff --git a/userspace/libraries/LibC/include/pthread.h b/userspace/libraries/LibC/include/pthread.h index ecddc579..57116254 100644 --- a/userspace/libraries/LibC/include/pthread.h +++ b/userspace/libraries/LibC/include/pthread.h @@ -170,6 +170,8 @@ void pthread_cleanup_push(void (*routine)(void*), void* arg); int pthread_getattr_np(pthread_t thread, pthread_attr_t* attr); int pthread_getattr_default_np(pthread_attr_t* attr); int pthread_setattr_default_np(const pthread_attr_t* attr); +int pthread_getname_np(pthread_t thread, char* name, size_t size); +int pthread_setname_np(pthread_t thread, const char* name); #define _pthread_equal(t1, t2) ((t1) == (t2)) diff --git a/userspace/libraries/LibC/pthread.cpp b/userspace/libraries/LibC/pthread.cpp index 81418b00..a1a0b901 100644 --- a/userspace/libraries/LibC/pthread.cpp +++ b/userspace/libraries/LibC/pthread.cpp @@ -61,6 +61,17 @@ static void _init_pthread() if (auto value = getauxval(AT_STACK_SIZE)) uthread->attr.stacksize = value; + char buffer[PATH_MAX]; + if (readlink("/proc/self/exe", buffer, sizeof(buffer)) == -1) + exit(0xFF); + + const char* last_slash = strrchr(buffer, '/'); + if (last_slash == nullptr) + last_slash = buffer; + + strncpy(uthread->name, last_slash, sizeof(uthread->name)); + uthread->name[sizeof(uthread->name) - 1] = '\0'; + signal(SIGCANCEL, &_pthread_cancel_handler); } @@ -449,6 +460,7 @@ int pthread_create(pthread_t* __restrict thread, const pthread_attr_t* __restric .dynamic_tls = self->dynamic_tls, .id = -1, .attr = attr ? *attr : s_default_pthread_attr, + .name = {}, .errno_ = 0, .libc_owns_stack = false, .cancel_type = PTHREAD_CANCEL_DEFERRED, @@ -459,6 +471,7 @@ int pthread_create(pthread_t* __restrict thread, const pthread_attr_t* __restric .specific_vals = {}, .dtv = { self->dtv[0] } }; + strcpy(uthread->name, self->name); if (uthread->attr.stackaddr == nullptr) { @@ -1338,6 +1351,24 @@ int pthread_setattr_default_np(const pthread_attr_t* attr) return 0; } +int pthread_getname_np(pthread_t thread, char* name, size_t size) +{ + const size_t namelen = strlen(thread->name); + if (size < namelen + 1) + return ERANGE; + strcpy(name, thread->name); + return 0; +} + +int pthread_setname_np(pthread_t thread, const char* name) +{ + const size_t namelen = strlen(name); + if (namelen >= sizeof(thread->name)) + return ERANGE; + strcpy(thread->name, name); + return 0; +} + static void load_dynamic_tls_module(size_t module) { auto* uthread = _get_uthread();