19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <thread.h>
49a747e4fSDavid du Colombier #include "threadimpl.h"
5d1be6b08SDavid du Colombier #include <tos.h>
69a747e4fSDavid du Colombier
79a747e4fSDavid du Colombier int
threadid(void)89a747e4fSDavid du Colombier threadid(void)
99a747e4fSDavid du Colombier {
109a747e4fSDavid du Colombier return _threadgetproc()->thread->id;
119a747e4fSDavid du Colombier }
129a747e4fSDavid du Colombier
139a747e4fSDavid du Colombier int
threadpid(int id)149a747e4fSDavid du Colombier threadpid(int id)
159a747e4fSDavid du Colombier {
169a747e4fSDavid du Colombier int pid;
179a747e4fSDavid du Colombier Proc *p;
189a747e4fSDavid du Colombier Thread *t;
199a747e4fSDavid du Colombier
209a747e4fSDavid du Colombier if (id < 0)
219a747e4fSDavid du Colombier return -1;
229a747e4fSDavid du Colombier if (id == 0)
239a747e4fSDavid du Colombier return _threadgetproc()->pid;
249a747e4fSDavid du Colombier lock(&_threadpq.lock);
2505a036adSDavid du Colombier for (p = _threadpq.head; p; p = p->next){
269a747e4fSDavid du Colombier lock(&p->lock);
279a747e4fSDavid du Colombier for (t = p->threads.head; t; t = t->nextt)
289a747e4fSDavid du Colombier if (t->id == id){
299a747e4fSDavid du Colombier pid = p->pid;
309a747e4fSDavid du Colombier unlock(&p->lock);
319a747e4fSDavid du Colombier unlock(&_threadpq.lock);
329a747e4fSDavid du Colombier return pid;
339a747e4fSDavid du Colombier }
349a747e4fSDavid du Colombier unlock(&p->lock);
359a747e4fSDavid du Colombier }
369a747e4fSDavid du Colombier unlock(&_threadpq.lock);
379a747e4fSDavid du Colombier return -1;
389a747e4fSDavid du Colombier }
399a747e4fSDavid du Colombier
409a747e4fSDavid du Colombier int
threadsetgrp(int ng)419a747e4fSDavid du Colombier threadsetgrp(int ng)
429a747e4fSDavid du Colombier {
439a747e4fSDavid du Colombier int og;
449a747e4fSDavid du Colombier Thread *t;
459a747e4fSDavid du Colombier
469a747e4fSDavid du Colombier t = _threadgetproc()->thread;
479a747e4fSDavid du Colombier og = t->grp;
489a747e4fSDavid du Colombier t->grp = ng;
499a747e4fSDavid du Colombier return og;
509a747e4fSDavid du Colombier }
519a747e4fSDavid du Colombier
529a747e4fSDavid du Colombier int
threadgetgrp(void)539a747e4fSDavid du Colombier threadgetgrp(void)
549a747e4fSDavid du Colombier {
559a747e4fSDavid du Colombier return _threadgetproc()->thread->grp;
569a747e4fSDavid du Colombier }
579a747e4fSDavid du Colombier
589a747e4fSDavid du Colombier void
threadsetname(char * fmt,...)59c193876bSDavid du Colombier threadsetname(char *fmt, ...)
609a747e4fSDavid du Colombier {
61c193876bSDavid du Colombier int fd;
62c193876bSDavid du Colombier char buf[128];
63c193876bSDavid du Colombier va_list arg;
6450a9bdd4SDavid du Colombier Proc *p;
659a747e4fSDavid du Colombier Thread *t;
669a747e4fSDavid du Colombier
6750a9bdd4SDavid du Colombier p = _threadgetproc();
6850a9bdd4SDavid du Colombier t = p->thread;
699a747e4fSDavid du Colombier if (t->cmdname)
709a747e4fSDavid du Colombier free(t->cmdname);
71c193876bSDavid du Colombier va_start(arg, fmt);
72c193876bSDavid du Colombier t->cmdname = vsmprint(fmt, arg);
73c193876bSDavid du Colombier va_end(arg);
74c193876bSDavid du Colombier if(t->cmdname && p->nthreads == 1){
75d1be6b08SDavid du Colombier snprint(buf, sizeof buf, "#p/%lud/args", _tos->pid); //getpid());
7650a9bdd4SDavid du Colombier if((fd = open(buf, OWRITE)) >= 0){
77c193876bSDavid du Colombier write(fd, t->cmdname, strlen(t->cmdname)+1);
7850a9bdd4SDavid du Colombier close(fd);
7950a9bdd4SDavid du Colombier }
8050a9bdd4SDavid du Colombier }
819a747e4fSDavid du Colombier }
829a747e4fSDavid du Colombier
839a747e4fSDavid du Colombier char*
threadgetname(void)849a747e4fSDavid du Colombier threadgetname(void)
859a747e4fSDavid du Colombier {
86*6ca6a3e7SDavid du Colombier Proc *p;
87*6ca6a3e7SDavid du Colombier
88*6ca6a3e7SDavid du Colombier if((p = _threadgetproc()) && p->thread)
89*6ca6a3e7SDavid du Colombier return p->thread->cmdname;
90*6ca6a3e7SDavid du Colombier return nil;
919a747e4fSDavid du Colombier }
929a747e4fSDavid du Colombier
939a747e4fSDavid du Colombier void**
threaddata(void)949a747e4fSDavid du Colombier threaddata(void)
959a747e4fSDavid du Colombier {
967fd46167SDavid du Colombier return &_threadgetproc()->thread->udata[0];
979a747e4fSDavid du Colombier }
989a747e4fSDavid du Colombier
999a747e4fSDavid du Colombier void**
_workerdata(void)100d1be6b08SDavid du Colombier _workerdata(void)
101d1be6b08SDavid du Colombier {
102d1be6b08SDavid du Colombier return &_threadgetproc()->wdata;
103d1be6b08SDavid du Colombier }
104d1be6b08SDavid du Colombier
105d1be6b08SDavid du Colombier void**
procdata(void)1069a747e4fSDavid du Colombier procdata(void)
1079a747e4fSDavid du Colombier {
1089a747e4fSDavid du Colombier return &_threadgetproc()->udata;
1099a747e4fSDavid du Colombier }
1109a747e4fSDavid du Colombier
1117fd46167SDavid du Colombier static Lock privlock;
1127fd46167SDavid du Colombier static int privmask = 1;
1137fd46167SDavid du Colombier
1147fd46167SDavid du Colombier int
tprivalloc(void)1157fd46167SDavid du Colombier tprivalloc(void)
1167fd46167SDavid du Colombier {
1177fd46167SDavid du Colombier int i;
1187fd46167SDavid du Colombier
1197fd46167SDavid du Colombier lock(&privlock);
1207fd46167SDavid du Colombier for(i=0; i<NPRIV; i++)
1217fd46167SDavid du Colombier if(!(privmask&(1<<i))){
1227fd46167SDavid du Colombier privmask |= 1<<i;
1237fd46167SDavid du Colombier unlock(&privlock);
1247fd46167SDavid du Colombier return i;
1257fd46167SDavid du Colombier }
1267fd46167SDavid du Colombier unlock(&privlock);
1277fd46167SDavid du Colombier return -1;
1287fd46167SDavid du Colombier }
1297fd46167SDavid du Colombier
1307fd46167SDavid du Colombier void
tprivfree(int i)1317fd46167SDavid du Colombier tprivfree(int i)
1327fd46167SDavid du Colombier {
1337fd46167SDavid du Colombier if(i < 0 || i >= NPRIV)
1347fd46167SDavid du Colombier abort();
1357fd46167SDavid du Colombier lock(&privlock);
1367fd46167SDavid du Colombier privmask &= ~(1<<i);
1377fd46167SDavid du Colombier }
1387fd46167SDavid du Colombier
1397fd46167SDavid du Colombier void**
tprivaddr(int i)1407fd46167SDavid du Colombier tprivaddr(int i)
1417fd46167SDavid du Colombier {
1427fd46167SDavid du Colombier return &_threadgetproc()->thread->udata[i];
1437fd46167SDavid du Colombier }
144