blob: d50acab2e91b7e5cb59b9e355572795400cd061b [file] [log] [blame]
#include <stdlib.h>
#include <sys/tls.h>
#include <parlib/vcore.h>
#include <ldsodefs.h>
void set_tls_desc(void* addr)
{
__set_tls_desc(addr);
}
void *get_tls_desc(void)
{
return __get_tls_desc();
}
/* Get a TLS, returns 0 on failure. Vcores have their own TLS, and any thread
* created by a user-level scheduler needs to create a TLS as well. */
void *allocate_tls(void)
{
void *tcb = _dl_allocate_tls(NULL);
if (!tcb)
return 0;
#ifdef TLS_TCB_AT_TP
/* Make sure the TLS is set up properly - its tcb pointer points to itself.
* Keep this in sync with sysdeps/akaros/XXX/tls.h. For whatever reason,
* dynamically linked programs do not need this to be redone, but statics
* do. */
tcbhead_t *head = (tcbhead_t*)tcb;
head->tcb = tcb;
head->self = tcb;
head->pointer_guard = THREAD_SELF->header.pointer_guard;
head->stack_guard = THREAD_SELF->header.stack_guard;
#endif
return tcb;
}
/* Free a previously allocated TLS region */
void free_tls(void *tcb)
{
_dl_deallocate_tls(tcb, TRUE);
}
/* Reinitialize / reset / refresh a TLS to its initial values. This doesn't do
* it properly yet, it merely frees and re-allocates the TLS, which is why we're
* slightly ghetto and return the pointer you should use for the TCB. */
void *reinit_tls(void *tcb)
{
/* TODO: keep this in sync with the methods used in
* allocate_transition_tls() */
free_tls(tcb);
return allocate_tls();
}