int thr_self() { int i; thread_t tid; lwp_self(&tid); for(i=0;(i<MAXTHREAD)&&(thread_table[i].thread_key != tid.thread_key);i++); return(i); }
ldap_pvt_thread_t ldap_pvt_thread_self( void ) { thread_t mylwp; lwp_self( &mylwp ); return mylwp; }
// Called to initialize a new m (including the bootstrap m). // Called on the new thread, can not allocate memory. void runtime·minit(void) { m->procid = runtime·lwp_self(); // Initialize signal handling runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024); runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil); }
unsigned int ldap_pvt_thread_sleep( unsigned int interval ) { thread_t mylwp; tl_t *t, *nt; time_t now; if ( lwp_self( &mylwp ) < 0 ) { return -1; } time( &now ); mon_enter( &sglob->tsl_mon ); if ( sglob->tsl_list != NULL ) { for ( t = sglob->tsl_list; t != NULL; t = t->tl_next ) { if ( SAMETHREAD( t->tl_tid, mylwp )) { /* We're already sleeping? */ t->tl_wake = now + interval; mon_exit( &sglob->tsl_mon ); lwp_suspend( mylwp ); return 0; } } } nt = (tl_t *) LDAP_MALLOC( sizeof( tl_t )); if( nt == NULL ) return -1; nt->tl_next = sglob->tsl_list; nt->tl_wake = now + interval; nt->tl_tid = mylwp; sglob->tsl_list = nt; mon_exit( &sglob->tsl_mon ); lwp_suspend( mylwp ); return 0; }
void mthread_init( context *mainctx ) { int i; for(i=0;i<MAXTHREAD;i++) thread_table[i].thread_key = -1; lwp_self(&thread_table[0]); mutex_init(&mark_lock, USYNC_THREAD, 0); mutex_init(&p_mark_lock, USYNC_THREAD, 0); mutex_init(&alloc_lock, USYNC_THREAD, 0); mutex_init(&free_thread_lock, USYNC_THREAD, 0); mutex_init(&qthread_lock, USYNC_THREAD, 0); mutex_init(&qsort_lock, USYNC_THREAD, 0); sema_init(&free_thread_sem, 0, USYNC_THREAD, 0); rwlock_init(&gc_lock, USYNC_THREAD, 0); pod_setmaxpri(2); lwp_setstkcache(32*1024*4, MAXTHREAD); lwp_create((thread_t *)0, scheduler, 2, 0, lwp_newstk(), 0); lwp_setpri(SELF,MINPRIO); }