Blame


1 76193d7c 2003-09-30 devnull #include "threadimpl.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull int
4 76193d7c 2003-09-30 devnull threadid(void)
5 76193d7c 2003-09-30 devnull {
6 76193d7c 2003-09-30 devnull return _threadgetproc()->thread->id;
7 76193d7c 2003-09-30 devnull }
8 76193d7c 2003-09-30 devnull
9 76193d7c 2003-09-30 devnull int
10 76193d7c 2003-09-30 devnull threadpid(int id)
11 76193d7c 2003-09-30 devnull {
12 76193d7c 2003-09-30 devnull int pid;
13 76193d7c 2003-09-30 devnull Proc *p;
14 76193d7c 2003-09-30 devnull Thread *t;
15 76193d7c 2003-09-30 devnull
16 76193d7c 2003-09-30 devnull if (id < 0)
17 76193d7c 2003-09-30 devnull return -1;
18 76193d7c 2003-09-30 devnull if (id == 0)
19 76193d7c 2003-09-30 devnull return _threadgetproc()->pid;
20 76193d7c 2003-09-30 devnull lock(&_threadpq.lock);
21 76193d7c 2003-09-30 devnull for (p = _threadpq.head; p->next; p = p->next){
22 76193d7c 2003-09-30 devnull lock(&p->lock);
23 76193d7c 2003-09-30 devnull for (t = p->threads.head; t; t = t->nextt)
24 76193d7c 2003-09-30 devnull if (t->id == id){
25 76193d7c 2003-09-30 devnull pid = p->pid;
26 76193d7c 2003-09-30 devnull unlock(&p->lock);
27 76193d7c 2003-09-30 devnull unlock(&_threadpq.lock);
28 76193d7c 2003-09-30 devnull return pid;
29 76193d7c 2003-09-30 devnull }
30 76193d7c 2003-09-30 devnull unlock(&p->lock);
31 76193d7c 2003-09-30 devnull }
32 76193d7c 2003-09-30 devnull unlock(&_threadpq.lock);
33 76193d7c 2003-09-30 devnull return -1;
34 76193d7c 2003-09-30 devnull }
35 76193d7c 2003-09-30 devnull
36 76193d7c 2003-09-30 devnull int
37 76193d7c 2003-09-30 devnull threadsetgrp(int ng)
38 76193d7c 2003-09-30 devnull {
39 76193d7c 2003-09-30 devnull int og;
40 76193d7c 2003-09-30 devnull Thread *t;
41 76193d7c 2003-09-30 devnull
42 76193d7c 2003-09-30 devnull t = _threadgetproc()->thread;
43 76193d7c 2003-09-30 devnull og = t->grp;
44 76193d7c 2003-09-30 devnull t->grp = ng;
45 76193d7c 2003-09-30 devnull return og;
46 76193d7c 2003-09-30 devnull }
47 76193d7c 2003-09-30 devnull
48 76193d7c 2003-09-30 devnull int
49 76193d7c 2003-09-30 devnull threadgetgrp(void)
50 76193d7c 2003-09-30 devnull {
51 76193d7c 2003-09-30 devnull return _threadgetproc()->thread->grp;
52 76193d7c 2003-09-30 devnull }
53 76193d7c 2003-09-30 devnull
54 76193d7c 2003-09-30 devnull void
55 76193d7c 2003-09-30 devnull threadsetname(char *name)
56 76193d7c 2003-09-30 devnull {
57 76193d7c 2003-09-30 devnull /*
58 76193d7c 2003-09-30 devnull int fd, n;
59 76193d7c 2003-09-30 devnull char buf[128], *s;
60 76193d7c 2003-09-30 devnull */
61 76193d7c 2003-09-30 devnull Proc *p;
62 76193d7c 2003-09-30 devnull Thread *t;
63 76193d7c 2003-09-30 devnull
64 76193d7c 2003-09-30 devnull p = _threadgetproc();
65 76193d7c 2003-09-30 devnull t = p->thread;
66 76193d7c 2003-09-30 devnull if (t->cmdname)
67 76193d7c 2003-09-30 devnull free(t->cmdname);
68 76193d7c 2003-09-30 devnull t->cmdname = strdup(name);
69 76193d7c 2003-09-30 devnull /* Plan 9 only
70 76193d7c 2003-09-30 devnull if(p->nthreads == 1){
71 76193d7c 2003-09-30 devnull snprint(buf, sizeof buf, "#p/%d/args", getpid());
72 76193d7c 2003-09-30 devnull if((fd = open(buf, OWRITE)) >= 0){
73 76193d7c 2003-09-30 devnull snprint(buf, sizeof buf, "%s [%s]", argv0, name);
74 76193d7c 2003-09-30 devnull n = strlen(buf)+1;
75 76193d7c 2003-09-30 devnull s = strchr(buf, ' ');
76 76193d7c 2003-09-30 devnull if(s)
77 76193d7c 2003-09-30 devnull *s = '\0';
78 76193d7c 2003-09-30 devnull write(fd, buf, n);
79 76193d7c 2003-09-30 devnull close(fd);
80 76193d7c 2003-09-30 devnull }
81 76193d7c 2003-09-30 devnull }
82 76193d7c 2003-09-30 devnull */
83 76193d7c 2003-09-30 devnull }
84 76193d7c 2003-09-30 devnull
85 76193d7c 2003-09-30 devnull char*
86 76193d7c 2003-09-30 devnull threadgetname(void)
87 76193d7c 2003-09-30 devnull {
88 76193d7c 2003-09-30 devnull return _threadgetproc()->thread->cmdname;
89 76193d7c 2003-09-30 devnull }
90 76193d7c 2003-09-30 devnull
91 76193d7c 2003-09-30 devnull void**
92 76193d7c 2003-09-30 devnull threaddata(void)
93 76193d7c 2003-09-30 devnull {
94 76193d7c 2003-09-30 devnull return &_threadgetproc()->thread->udata[0];
95 76193d7c 2003-09-30 devnull }
96 76193d7c 2003-09-30 devnull
97 76193d7c 2003-09-30 devnull void**
98 76193d7c 2003-09-30 devnull procdata(void)
99 76193d7c 2003-09-30 devnull {
100 76193d7c 2003-09-30 devnull return &_threadgetproc()->udata;
101 76193d7c 2003-09-30 devnull }
102 76193d7c 2003-09-30 devnull
103 76193d7c 2003-09-30 devnull static Lock privlock;
104 76193d7c 2003-09-30 devnull static int privmask = 1;
105 76193d7c 2003-09-30 devnull
106 76193d7c 2003-09-30 devnull int
107 76193d7c 2003-09-30 devnull tprivalloc(void)
108 76193d7c 2003-09-30 devnull {
109 76193d7c 2003-09-30 devnull int i;
110 76193d7c 2003-09-30 devnull
111 76193d7c 2003-09-30 devnull lock(&privlock);
112 76193d7c 2003-09-30 devnull for(i=0; i<NPRIV; i++)
113 76193d7c 2003-09-30 devnull if(!(privmask&(1<<i))){
114 76193d7c 2003-09-30 devnull privmask |= 1<<i;
115 76193d7c 2003-09-30 devnull unlock(&privlock);
116 76193d7c 2003-09-30 devnull return i;
117 76193d7c 2003-09-30 devnull }
118 76193d7c 2003-09-30 devnull unlock(&privlock);
119 76193d7c 2003-09-30 devnull return -1;
120 76193d7c 2003-09-30 devnull }
121 76193d7c 2003-09-30 devnull
122 76193d7c 2003-09-30 devnull void
123 76193d7c 2003-09-30 devnull tprivfree(int i)
124 76193d7c 2003-09-30 devnull {
125 76193d7c 2003-09-30 devnull if(i < 0 || i >= NPRIV)
126 76193d7c 2003-09-30 devnull abort();
127 76193d7c 2003-09-30 devnull lock(&privlock);
128 76193d7c 2003-09-30 devnull privmask &= ~(1<<i);
129 76193d7c 2003-09-30 devnull }
130 76193d7c 2003-09-30 devnull
131 76193d7c 2003-09-30 devnull void**
132 76193d7c 2003-09-30 devnull tprivaddr(int i)
133 76193d7c 2003-09-30 devnull {
134 76193d7c 2003-09-30 devnull return &_threadgetproc()->thread->udata[i];
135 76193d7c 2003-09-30 devnull }