aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/proctab.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libthread/proctab.c')
-rw-r--r--src/libthread/proctab.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/libthread/proctab.c b/src/libthread/proctab.c
new file mode 100644
index 00000000..4029652a
--- /dev/null
+++ b/src/libthread/proctab.c
@@ -0,0 +1,64 @@
+#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;
+
+ 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);
+}