LibC: Implement pthread_{get,set}name_np
This commit is contained in:
@@ -48,6 +48,7 @@ struct uthread
|
|||||||
// LIBC
|
// LIBC
|
||||||
pid_t id;
|
pid_t id;
|
||||||
pthread_attr_t attr;
|
pthread_attr_t attr;
|
||||||
|
char name[16];
|
||||||
int errno_;
|
int errno_;
|
||||||
int libc_owns_stack;
|
int libc_owns_stack;
|
||||||
int cancel_type;
|
int cancel_type;
|
||||||
|
|||||||
@@ -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_np(pthread_t thread, pthread_attr_t* attr);
|
||||||
int pthread_getattr_default_np(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_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))
|
#define _pthread_equal(t1, t2) ((t1) == (t2))
|
||||||
|
|
||||||
|
|||||||
@@ -61,6 +61,17 @@ static void _init_pthread()
|
|||||||
if (auto value = getauxval(AT_STACK_SIZE))
|
if (auto value = getauxval(AT_STACK_SIZE))
|
||||||
uthread->attr.stacksize = value;
|
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);
|
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,
|
.dynamic_tls = self->dynamic_tls,
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.attr = attr ? *attr : s_default_pthread_attr,
|
.attr = attr ? *attr : s_default_pthread_attr,
|
||||||
|
.name = {},
|
||||||
.errno_ = 0,
|
.errno_ = 0,
|
||||||
.libc_owns_stack = false,
|
.libc_owns_stack = false,
|
||||||
.cancel_type = PTHREAD_CANCEL_DEFERRED,
|
.cancel_type = PTHREAD_CANCEL_DEFERRED,
|
||||||
@@ -459,6 +471,7 @@ int pthread_create(pthread_t* __restrict thread, const pthread_attr_t* __restric
|
|||||||
.specific_vals = {},
|
.specific_vals = {},
|
||||||
.dtv = { self->dtv[0] }
|
.dtv = { self->dtv[0] }
|
||||||
};
|
};
|
||||||
|
strcpy(uthread->name, self->name);
|
||||||
|
|
||||||
if (uthread->attr.stackaddr == nullptr)
|
if (uthread->attr.stackaddr == nullptr)
|
||||||
{
|
{
|
||||||
@@ -1338,6 +1351,24 @@ int pthread_setattr_default_np(const pthread_attr_t* attr)
|
|||||||
return 0;
|
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)
|
static void load_dynamic_tls_module(size_t module)
|
||||||
{
|
{
|
||||||
auto* uthread = _get_uthread();
|
auto* uthread = _get_uthread();
|
||||||
|
|||||||
Reference in New Issue
Block a user