#define __USE_GNU /* non-posix functions */ #include #undef __USE_GNU #include // the thread_self algorithm: /* 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 */ static _pthread_descr linuxthreads_self() { pthread_mutexattr_t mutexattr; pthread_mutex_t mutex; _pthread_descr self; pthread_mutexattr_init (&mutexattr); pthread_mutexattr_setkind_np (&mutexattr, PTHREAD_MUTEX_ERRORCHECK_NP); pthread_mutex_init (&mutex, &mutexattr); pthread_mutex_lock (&mutex); self = mutex.__m_owner; pthread_mutex_unlock (&mutex); printf ("pthread_self: %d\n", pthread_self()); printf ("descr: %p\n", self); return self; } void *pthread (void *unused) { linuxthreads_self(); return NULL; } int main (int argc, char *argv[]) { pthread_t tid; pthread_create (&tid, NULL, pthread, NULL); pthread_join (tid, NULL); linuxthreads_self(); exit (0); }