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