19a747e4fSDavid du Colombier #include <u.h> 29a747e4fSDavid du Colombier #include <libc.h> 39a747e4fSDavid du Colombier #include <thread.h> 49a747e4fSDavid du Colombier #include "threadimpl.h" 59a747e4fSDavid du Colombier 69a747e4fSDavid du Colombier int 79a747e4fSDavid du Colombier threadid(void) 89a747e4fSDavid du Colombier { 99a747e4fSDavid du Colombier return _threadgetproc()->thread->id; 109a747e4fSDavid du Colombier } 119a747e4fSDavid du Colombier 129a747e4fSDavid du Colombier int 139a747e4fSDavid du Colombier threadpid(int id) 149a747e4fSDavid du Colombier { 159a747e4fSDavid du Colombier int pid; 169a747e4fSDavid du Colombier Proc *p; 179a747e4fSDavid du Colombier Thread *t; 189a747e4fSDavid du Colombier 199a747e4fSDavid du Colombier if (id < 0) 209a747e4fSDavid du Colombier return -1; 219a747e4fSDavid du Colombier if (id == 0) 229a747e4fSDavid du Colombier return _threadgetproc()->pid; 239a747e4fSDavid du Colombier lock(&_threadpq.lock); 249a747e4fSDavid du Colombier for (p = _threadpq.head; p->next; p = p->next){ 259a747e4fSDavid du Colombier lock(&p->lock); 269a747e4fSDavid du Colombier for (t = p->threads.head; t; t = t->nextt) 279a747e4fSDavid du Colombier if (t->id == id){ 289a747e4fSDavid du Colombier pid = p->pid; 299a747e4fSDavid du Colombier unlock(&p->lock); 309a747e4fSDavid du Colombier unlock(&_threadpq.lock); 319a747e4fSDavid du Colombier return pid; 329a747e4fSDavid du Colombier } 339a747e4fSDavid du Colombier unlock(&p->lock); 349a747e4fSDavid du Colombier } 359a747e4fSDavid du Colombier unlock(&_threadpq.lock); 369a747e4fSDavid du Colombier return -1; 379a747e4fSDavid du Colombier } 389a747e4fSDavid du Colombier 399a747e4fSDavid du Colombier int 409a747e4fSDavid du Colombier threadsetgrp(int ng) 419a747e4fSDavid du Colombier { 429a747e4fSDavid du Colombier int og; 439a747e4fSDavid du Colombier Thread *t; 449a747e4fSDavid du Colombier 459a747e4fSDavid du Colombier t = _threadgetproc()->thread; 469a747e4fSDavid du Colombier og = t->grp; 479a747e4fSDavid du Colombier t->grp = ng; 489a747e4fSDavid du Colombier return og; 499a747e4fSDavid du Colombier } 509a747e4fSDavid du Colombier 519a747e4fSDavid du Colombier int 529a747e4fSDavid du Colombier threadgetgrp(void) 539a747e4fSDavid du Colombier { 549a747e4fSDavid du Colombier return _threadgetproc()->thread->grp; 559a747e4fSDavid du Colombier } 569a747e4fSDavid du Colombier 579a747e4fSDavid du Colombier void 58*c193876bSDavid du Colombier threadsetname(char *fmt, ...) 599a747e4fSDavid du Colombier { 60*c193876bSDavid du Colombier int fd; 61*c193876bSDavid du Colombier char buf[128]; 62*c193876bSDavid du Colombier va_list arg; 6350a9bdd4SDavid du Colombier Proc *p; 649a747e4fSDavid du Colombier Thread *t; 659a747e4fSDavid du Colombier 6650a9bdd4SDavid du Colombier p = _threadgetproc(); 6750a9bdd4SDavid du Colombier t = p->thread; 689a747e4fSDavid du Colombier if (t->cmdname) 699a747e4fSDavid du Colombier free(t->cmdname); 70*c193876bSDavid du Colombier va_start(arg, fmt); 71*c193876bSDavid du Colombier t->cmdname = vsmprint(fmt, arg); 72*c193876bSDavid du Colombier va_end(arg); 73*c193876bSDavid du Colombier if(t->cmdname && p->nthreads == 1){ 7450a9bdd4SDavid du Colombier snprint(buf, sizeof buf, "#p/%d/args", getpid()); 7550a9bdd4SDavid du Colombier if((fd = open(buf, OWRITE)) >= 0){ 76*c193876bSDavid du Colombier write(fd, t->cmdname, strlen(t->cmdname)+1); 7750a9bdd4SDavid du Colombier close(fd); 7850a9bdd4SDavid du Colombier } 7950a9bdd4SDavid du Colombier } 809a747e4fSDavid du Colombier } 819a747e4fSDavid du Colombier 829a747e4fSDavid du Colombier char* 839a747e4fSDavid du Colombier threadgetname(void) 849a747e4fSDavid du Colombier { 859a747e4fSDavid du Colombier return _threadgetproc()->thread->cmdname; 869a747e4fSDavid du Colombier } 879a747e4fSDavid du Colombier 889a747e4fSDavid du Colombier void** 899a747e4fSDavid du Colombier threaddata(void) 909a747e4fSDavid du Colombier { 917fd46167SDavid du Colombier return &_threadgetproc()->thread->udata[0]; 929a747e4fSDavid du Colombier } 939a747e4fSDavid du Colombier 949a747e4fSDavid du Colombier void** 959a747e4fSDavid du Colombier procdata(void) 969a747e4fSDavid du Colombier { 979a747e4fSDavid du Colombier return &_threadgetproc()->udata; 989a747e4fSDavid du Colombier } 999a747e4fSDavid du Colombier 1007fd46167SDavid du Colombier static Lock privlock; 1017fd46167SDavid du Colombier static int privmask = 1; 1027fd46167SDavid du Colombier 1037fd46167SDavid du Colombier int 1047fd46167SDavid du Colombier tprivalloc(void) 1057fd46167SDavid du Colombier { 1067fd46167SDavid du Colombier int i; 1077fd46167SDavid du Colombier 1087fd46167SDavid du Colombier lock(&privlock); 1097fd46167SDavid du Colombier for(i=0; i<NPRIV; i++) 1107fd46167SDavid du Colombier if(!(privmask&(1<<i))){ 1117fd46167SDavid du Colombier privmask |= 1<<i; 1127fd46167SDavid du Colombier unlock(&privlock); 1137fd46167SDavid du Colombier return i; 1147fd46167SDavid du Colombier } 1157fd46167SDavid du Colombier unlock(&privlock); 1167fd46167SDavid du Colombier return -1; 1177fd46167SDavid du Colombier } 1187fd46167SDavid du Colombier 1197fd46167SDavid du Colombier void 1207fd46167SDavid du Colombier tprivfree(int i) 1217fd46167SDavid du Colombier { 1227fd46167SDavid du Colombier if(i < 0 || i >= NPRIV) 1237fd46167SDavid du Colombier abort(); 1247fd46167SDavid du Colombier lock(&privlock); 1257fd46167SDavid du Colombier privmask &= ~(1<<i); 1267fd46167SDavid du Colombier } 1277fd46167SDavid du Colombier 1287fd46167SDavid du Colombier void** 1297fd46167SDavid du Colombier tprivaddr(int i) 1307fd46167SDavid du Colombier { 1317fd46167SDavid du Colombier return &_threadgetproc()->thread->udata[i]; 1327fd46167SDavid du Colombier } 133