#include "threadimpl.h" int threadid(void) { return _threadgetproc()->thread->id; } int threadpid(int id) { int pid; Proc *p; Thread *t; if (id < 0) return -1; if (id == 0) return _threadgetproc()->pid; lock(&_threadpq.lock); for (p = _threadpq.head; p->next; p = p->next){ lock(&p->lock); for (t = p->threads.head; t; t = t->nextt) if (t->id == id){ pid = p->pid; unlock(&p->lock); unlock(&_threadpq.lock); return pid; } unlock(&p->lock); } unlock(&_threadpq.lock); return -1; } int threadsetgrp(int ng) { int og; Thread *t; t = _threadgetproc()->thread; og = t->grp; t->grp = ng; return og; } int threadgetgrp(void) { return _threadgetproc()->thread->grp; } void threadsetname(char *fmt, ...) { Proc *p; Thread *t; va_list arg; p = _threadgetproc(); t = p->thread; if(t->name) free(t->name); va_start(arg, fmt); t->name = vsmprint(fmt, arg); va_end(arg); _threaddebug(DBGSCHED, "set name %s", t->name); /* Plan 9 only if(p->nthreads == 1){ snprint(buf, sizeof buf, "#p/%d/args", getpid()); if((fd = open(buf, OWRITE)) >= 0){ snprint(buf, sizeof buf, "%s [%s]", argv0, name); n = strlen(buf)+1; s = strchr(buf, ' '); if(s) *s = '\0'; write(fd, buf, n); close(fd); } } */ } char* threadgetname(void) { return _threadgetproc()->thread->name; } void** threaddata(void) { return &_threadgetproc()->thread->udata[0]; } void** procdata(void) { return &_threadgetproc()->udata; } static Lock privlock; static int privmask = 1; int tprivalloc(void) { int i; lock(&privlock); for(i=0; i= NPRIV) abort(); lock(&privlock); privmask &= ~(1<thread->udata[i]; }