err = ENOMEM;
goto failed_thread_tls_alloc;
}
+#if TLS_TCB_AT_TP
pthread->tcb->tcb = pthread->tcb;
+#endif
/* And initialize the rest of the machine context. This may include
additional machine- and system-specific initializations that
#include <pthread.h>
#include <htl/pt-internal.h>
+static inline int *
+thread_gscope_flag (struct __pthread *t)
+{
+#if TLS_TCB_AT_TP
+ return &t->tcb->gscope_flag;
+#elif TLS_DTV_AT_TP
+ return &((tcbprehead_t *) t->tcb - 1)->gscope_flag;
+#else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+#endif
+}
+
void
__thread_gscope_wait (void)
{
for (i = 0; i < GL (dl_pthread_num_threads); ++i)
{
t = GL (dl_pthread_threads[i]);
- if (t == NULL || t->tcb->gscope_flag == THREAD_GSCOPE_FLAG_UNUSED)
+ if (t == NULL || *thread_gscope_flag (t) == THREAD_GSCOPE_FLAG_UNUSED)
continue;
- gscope_flagp = &t->tcb->gscope_flag;
+ gscope_flagp = thread_gscope_flag (t);
/* We have to wait until this thread is done with the global
scope. First tell the thread that we are waiting and
to the new stack. Pretend it wasn't allocated so that it remains
valid if the main thread terminates. */
thread->stack = 0;
+#if TLS_TCB_AT_TP
thread->tcb = THREAD_SELF;
+#elif TLS_DTV_AT_TP
+ /* Assuming THREAD_SELF is implemented as subtracting TLS_PRE_TCB_SIZE
+ from the value of a thread pointer regsiter, this should optimize
+ down to simply reading that register. */
+ thread->tcb = (tcbhead_t *) (((char *) THREAD_SELF) + TLS_PRE_TCB_SIZE);
+#else
+# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
+#endif
#ifndef PAGESIZE
__pthread_default_attr.__guardsize = __vm_page_size;