Remove dependency for {unistd,stdlib}.h in vcore.h (XCC)
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.19-akaros / sysdeps / akaros / tls.c
1 #include <stdlib.h>
2 #include <sys/tls.h>
3 #include <parlib/vcore.h>
4 #include <ldsodefs.h>
5
6 void set_tls_desc(void* addr)
7 {
8         __set_tls_desc(addr);
9 }
10
11 void *get_tls_desc(void)
12 {
13         return __get_tls_desc();
14 }
15
16 /* Get a TLS, returns 0 on failure.  Vcores have their own TLS, and any thread
17  * created by a user-level scheduler needs to create a TLS as well. */
18 void *allocate_tls(void)
19 {
20         void *tcb = _dl_allocate_tls(NULL);
21         if (!tcb)
22                 return 0;
23 #ifdef TLS_TCB_AT_TP
24         /* Make sure the TLS is set up properly - its tcb pointer points to itself.
25          * Keep this in sync with sysdeps/akaros/XXX/tls.h.  For whatever reason,
26          * dynamically linked programs do not need this to be redone, but statics
27          * do. */
28         tcbhead_t *head = (tcbhead_t*)tcb;
29         head->tcb = tcb;
30         head->self = tcb;
31 #endif
32         return tcb;
33 }
34
35 /* Free a previously allocated TLS region */
36 void free_tls(void *tcb)
37 {
38         _dl_deallocate_tls(tcb, TRUE);
39 }
40
41 /* Reinitialize / reset / refresh a TLS to its initial values.  This doesn't do
42  * it properly yet, it merely frees and re-allocates the TLS, which is why we're
43  * slightly ghetto and return the pointer you should use for the TCB. */
44 void *reinit_tls(void *tcb)
45 {
46         /* TODO: keep this in sync with the methods used in
47          * allocate_transition_tls() */
48         free_tls(tcb);
49         return allocate_tls();
50 }