#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);

/* 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; i++)
		if(!(privmask&(1<<i))){
			privmask |= 1<<i;
			unlock(&privlock);
			return i;
		}
	unlock(&privlock);
	return -1;
}

void
tprivfree(int i)
{
	if(i < 0 || i >= NPRIV)
		abort();
	lock(&privlock);
	privmask &= ~(1<<i);
}

void**
tprivaddr(int i)
{
	return &_threadgetproc()->thread->udata[i];
}
