#include <bits/local_lim.h> /* PTHREAD_THREADS_MAX */
#include <sys/types.h> /* _pthread_fastlock */
+#ifndef CURRENT_STACK_FRAME
+#define CURRENT_STACK_FRAME ({ char __csf; &__csf; })
+#endif /* CURRENT_STACK_FRAME */
+
+#ifndef STACK_SIZE
+#define STACK_SIZE 0x20000 /* 2 M linuxthreads default stack size */
+#endif
+
typedef void * pthread_descr;
/* Global array of thread handles, used for validating a thread id
#include <pthread.h>
#include "linuxthreads-internals.h"
-#ifndef CURRENT_STACK_FRAME
-#define CURRENT_STACK_FRAME ({ char __csf; &__csf; })
-#endif /* CURRENT_STACK_FRAME */
-
pth_mctx_t main_context;
int threadnum = 0;
--- /dev/null
+#include <pthread.h>
+#include <stdio.h>
+#include "linuxthreads-internals.h"
+
+#pragma weak __pthread_initial_thread
+extern pthread_descr __pthread_initial_thread;
+
+static inline thread_self_descr()
+{
+ char * sp = CURRENT_STACK_FRAME;
+ int self = (int) pthread_self();
+
+ if (self % PTHREAD_THREADS_MAX < 2)
+ /* we only support the main thread, not the manager. */
+ return &__pthread_initial_thread;
+
+#ifdef _STACK_GROWS_DOWN
+ return (pthread_descr)(((unsigned long)sp | (STACK_SIZE-1))+1) - 1;
+#else
+ return (pthread_descr)((unsigned long)sp &~ (STACK_SIZE-1));
+#endif
+}
+
+int main (int argc, char *argv[])
+{
+ printf ("pthread_self: %d\n", pthread_self());
+ printf ("descr: %p\n", thread_self_descr());
+ exit (0);
+}