xref: /plan9/sys/src/libthread/id.c (revision 6ca6a3e703ee2ec4aed99c2177f71d7f127da6d9)
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