提交 ac31bf27 编写于 作者: R Rich Felker

simplify errno implementation

the motivation for the errno_ptr field in the thread structure, which
this commit removes, was to allow the main thread's errno to keep its
address when lazy thread pointer initialization was used. &errno was
evaluated prior to setting up the thread pointer and stored in
errno_ptr for the main thread; subsequently created threads would have
errno_ptr pointing to their own errno_val in the thread structure.

since lazy initialization was removed, there is no need for this extra
level of indirection; __errno_location can simply return the address
of the thread's errno_val directly. this does cause &errno to change,
but the change happens before entry to application code, and thus is
not observable.
上级 df15168c
......@@ -16,7 +16,6 @@ int __init_tp(void *p)
if (!r) libc.can_do_threads = 1;
libc.has_thread_pointer = 1;
td->tid = td->pid = __syscall(SYS_set_tid_address, &td->tid);
td->errno_ptr = &td->errno_val;
return 0;
}
......
......@@ -3,6 +3,6 @@
int *__errno_location(void)
{
static int e;
if (libc.has_thread_pointer) return __pthread_self()->errno_ptr;
if (libc.has_thread_pointer) return &__pthread_self()->errno_val;
return &e;
}
......@@ -18,7 +18,7 @@ struct pthread {
uintptr_t sysinfo;
uintptr_t canary;
pid_t tid, pid;
int tsd_used, errno_val, *errno_ptr;
int tsd_used, errno_val;
volatile int cancel, canceldisable, cancelasync;
int detached;
unsigned char *map_base;
......
......@@ -201,7 +201,6 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
new->stack = stack;
new->stack_size = stack - stack_limit;
new->pid = self->pid;
new->errno_ptr = &new->errno_val;
new->start = entry;
new->start_arg = arg;
new->self = new;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册