#include "threadimpl.h"

/* this will need work */
enum
{
	PTABHASH = 257,
};

static Lock ptablock;
Proc *ptab[PTABHASH];

void
_threadsetproc(Proc *p)
{
	int h;

	lock(&ptablock);
	h = ((unsigned)p->pid)%PTABHASH;
	p->link = ptab[h];
	unlock(&ptablock);
	ptab[h] = p;
}

static Proc*
__threadgetproc(int rm)
{
	Proc **l, *p;
	int h, pid;
	Thread *t;
	ulong *s;

/* fails on linux, probably because the main stack
 * has to be grown a page at a time instead of the big jump?
	s = (ulong*)((ulong)&pid & ~(STKSIZE-1));
	if(s[0] == STKMAGIC){
		t = (Thread*)s[1];
		return t->proc;
	}
*/
	pid = _threadgetpid();

	lock(&ptablock);
	h = ((unsigned)pid)%PTABHASH;
	for(l=&ptab[h]; p=*l; l=&p->link){
		if(p->pid == pid){
			if(rm)
				*l = p->link;
			unlock(&ptablock);
			return p;
		}
	}
	unlock(&ptablock);
	return nil;
}

Proc*
_threadgetproc(void)
{
	return __threadgetproc(0);
}

Proc*
_threaddelproc(void)
{
	return __threadgetproc(1);
}