projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
setjmp: optimize x86 longjmp epilogues
[musl]
/
src
/
env
/
__init_tls.c
diff --git
a/src/env/__init_tls.c
b/src/env/__init_tls.c
index
842886f
..
772baba
100644
(file)
--- a/
src/env/__init_tls.c
+++ b/
src/env/__init_tls.c
@@
-1,3
+1,4
@@
+#define SYSCALL_NO_TLS 1
#include <elf.h>
#include <limits.h>
#include <sys/mman.h>
#include <elf.h>
#include <limits.h>
#include <sys/mman.h>
@@
-8,6
+9,8
@@
#include "atomic.h"
#include "syscall.h"
#include "atomic.h"
#include "syscall.h"
+volatile int __thread_list_lock;
+
int __init_tp(void *p)
{
pthread_t td = p;
int __init_tp(void *p)
{
pthread_t td = p;
@@
-16,9
+19,11
@@
int __init_tp(void *p)
if (r < 0) return -1;
if (!r) libc.can_do_threads = 1;
td->detach_state = DT_JOINABLE;
if (r < 0) return -1;
if (!r) libc.can_do_threads = 1;
td->detach_state = DT_JOINABLE;
- td->tid = __syscall(SYS_set_tid_address, &
td->detach_state
);
+ td->tid = __syscall(SYS_set_tid_address, &
__thread_list_lock
);
td->locale = &libc.global_locale;
td->robust_list.head = &td->robust_list.head;
td->locale = &libc.global_locale;
td->robust_list.head = &td->robust_list.head;
+ td->sysinfo = __sysinfo;
+ td->next = td->prev = td;
return 0;
}
return 0;
}
@@
-110,7
+115,8
@@
static void static_init_tls(size_t *aux)
& (main_tls.align-1);
#ifdef TLS_ABOVE_TP
main_tls.offset = GAP_ABOVE_TP;
& (main_tls.align-1);
#ifdef TLS_ABOVE_TP
main_tls.offset = GAP_ABOVE_TP;
- main_tls.offset += -GAP_ABOVE_TP & (main_tls.align-1);
+ main_tls.offset += (-GAP_ABOVE_TP + (uintptr_t)main_tls.image)
+ & (main_tls.align-1);
#else
main_tls.offset = main_tls.size;
#endif
#else
main_tls.offset = main_tls.size;
#endif