فهرست منبع

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.
Rich Felker 11 سال پیش
والد
کامیت
ac31bf278d
4فایلهای تغییر یافته به همراه2 افزوده شده و 4 حذف شده
  1. 0 1
      src/env/__init_tls.c
  2. 1 1
      src/errno/__errno_location.c
  3. 1 1
      src/internal/pthread_impl.h
  4. 0 1
      src/thread/pthread_create.c

+ 0 - 1
src/env/__init_tls.c

@@ -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;
 }
 

+ 1 - 1
src/errno/__errno_location.c

@@ -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;
 }

+ 1 - 1
src/internal/pthread_impl.h

@@ -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;

+ 0 - 1
src/thread/pthread_create.c

@@ -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;