Blame


1 be22ae2d 2004-03-26 devnull #include <u.h>
2 76193d7c 2003-09-30 devnull #include <signal.h>
3 cd7ddc9b 2003-11-23 devnull #include "threadimpl.h"
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull typedef struct Mainarg Mainarg;
6 76193d7c 2003-09-30 devnull struct Mainarg
7 76193d7c 2003-09-30 devnull {
8 76193d7c 2003-09-30 devnull int argc;
9 76193d7c 2003-09-30 devnull char **argv;
10 76193d7c 2003-09-30 devnull };
11 76193d7c 2003-09-30 devnull
12 76193d7c 2003-09-30 devnull int mainstacksize;
13 76193d7c 2003-09-30 devnull int _threadnotefd;
14 76193d7c 2003-09-30 devnull int _threadpasserpid;
15 76193d7c 2003-09-30 devnull static void mainlauncher(void*);
16 76193d7c 2003-09-30 devnull extern void (*_sysfatal)(char*, va_list);
17 76193d7c 2003-09-30 devnull
18 76193d7c 2003-09-30 devnull void
19 02a1a5c1 2004-03-05 devnull _threadstatus(int x)
20 02a1a5c1 2004-03-05 devnull {
21 02a1a5c1 2004-03-05 devnull USED(x);
22 02a1a5c1 2004-03-05 devnull threadstatus();
23 02a1a5c1 2004-03-05 devnull }
24 02a1a5c1 2004-03-05 devnull
25 02a1a5c1 2004-03-05 devnull void
26 76193d7c 2003-09-30 devnull _threaddie(int x)
27 76193d7c 2003-09-30 devnull {
28 76193d7c 2003-09-30 devnull extern char *_threadexitsallstatus;
29 76193d7c 2003-09-30 devnull USED(x);
30 76193d7c 2003-09-30 devnull
31 76193d7c 2003-09-30 devnull if(_threadexitsallstatus)
32 76193d7c 2003-09-30 devnull exit(_threadexitsallstatus[0] ? 1 : 0);
33 76193d7c 2003-09-30 devnull }
34 76193d7c 2003-09-30 devnull
35 5a8e63b2 2004-02-29 devnull static void
36 5a8e63b2 2004-02-29 devnull _nop(int x)
37 5a8e63b2 2004-02-29 devnull {
38 5a8e63b2 2004-02-29 devnull USED(x);
39 5a8e63b2 2004-02-29 devnull }
40 5a8e63b2 2004-02-29 devnull
41 76193d7c 2003-09-30 devnull int
42 76193d7c 2003-09-30 devnull main(int argc, char **argv)
43 76193d7c 2003-09-30 devnull {
44 76193d7c 2003-09-30 devnull Mainarg *a;
45 76193d7c 2003-09-30 devnull Proc *p;
46 76193d7c 2003-09-30 devnull
47 76193d7c 2003-09-30 devnull signal(SIGTERM, _threaddie);
48 5a8e63b2 2004-02-29 devnull signal(SIGCHLD, _nop);
49 2277c5d7 2004-03-21 devnull signal(SIGALRM, _nop);
50 15680d56 2004-03-05 devnull // signal(SIGINFO, _threadstatus);
51 76193d7c 2003-09-30 devnull // rfork(RFREND);
52 76193d7c 2003-09-30 devnull
53 76193d7c 2003-09-30 devnull //_threaddebuglevel = (DBGSCHED|DBGCHAN|DBGREND)^~0;
54 76193d7c 2003-09-30 devnull _systhreadinit();
55 76193d7c 2003-09-30 devnull _qlockinit(_threadrendezvous);
56 76193d7c 2003-09-30 devnull _sysfatal = _threadsysfatal;
57 32f69c36 2003-12-11 devnull notify(_threadnote);
58 76193d7c 2003-09-30 devnull if(mainstacksize == 0)
59 76193d7c 2003-09-30 devnull mainstacksize = 32*1024;
60 76193d7c 2003-09-30 devnull
61 76193d7c 2003-09-30 devnull a = _threadmalloc(sizeof *a, 1);
62 76193d7c 2003-09-30 devnull a->argc = argc;
63 76193d7c 2003-09-30 devnull a->argv = argv;
64 76193d7c 2003-09-30 devnull
65 76193d7c 2003-09-30 devnull p = _newproc(mainlauncher, a, mainstacksize, "threadmain", 0, 0);
66 76193d7c 2003-09-30 devnull _schedinit(p);
67 76193d7c 2003-09-30 devnull abort(); /* not reached */
68 76193d7c 2003-09-30 devnull return 0;
69 76193d7c 2003-09-30 devnull }
70 76193d7c 2003-09-30 devnull
71 76193d7c 2003-09-30 devnull static void
72 76193d7c 2003-09-30 devnull mainlauncher(void *arg)
73 76193d7c 2003-09-30 devnull {
74 76193d7c 2003-09-30 devnull Mainarg *a;
75 76193d7c 2003-09-30 devnull
76 76193d7c 2003-09-30 devnull a = arg;
77 76193d7c 2003-09-30 devnull threadmain(a->argc, a->argv);
78 76193d7c 2003-09-30 devnull threadexits("threadmain");
79 76193d7c 2003-09-30 devnull }
80 76193d7c 2003-09-30 devnull
81 76193d7c 2003-09-30 devnull void
82 76193d7c 2003-09-30 devnull _threadsignal(void)
83 76193d7c 2003-09-30 devnull {
84 76193d7c 2003-09-30 devnull }
85 76193d7c 2003-09-30 devnull
86 76193d7c 2003-09-30 devnull void
87 76193d7c 2003-09-30 devnull _threadsignalpasser(void)
88 76193d7c 2003-09-30 devnull {
89 76193d7c 2003-09-30 devnull }
90 76193d7c 2003-09-30 devnull
91 76193d7c 2003-09-30 devnull int
92 76193d7c 2003-09-30 devnull _schedfork(Proc *p)
93 76193d7c 2003-09-30 devnull {
94 cd7ddc9b 2003-11-23 devnull int pid;
95 cd7ddc9b 2003-11-23 devnull lock(&p->lock);
96 cd7ddc9b 2003-11-23 devnull pid = ffork(RFMEM|RFNOWAIT, _schedinit, p);
97 cd7ddc9b 2003-11-23 devnull p->pid = pid;
98 cd7ddc9b 2003-11-23 devnull unlock(&p->lock);
99 cd7ddc9b 2003-11-23 devnull return pid;
100 cd7ddc9b 2003-11-23 devnull
101 76193d7c 2003-09-30 devnull }
102 76193d7c 2003-09-30 devnull
103 76193d7c 2003-09-30 devnull void
104 76193d7c 2003-09-30 devnull _schedexit(Proc *p)
105 76193d7c 2003-09-30 devnull {
106 76193d7c 2003-09-30 devnull char ex[ERRMAX];
107 76193d7c 2003-09-30 devnull Proc **l;
108 76193d7c 2003-09-30 devnull
109 76193d7c 2003-09-30 devnull lock(&_threadpq.lock);
110 76193d7c 2003-09-30 devnull for(l=&_threadpq.head; *l; l=&(*l)->next){
111 76193d7c 2003-09-30 devnull if(*l == p){
112 76193d7c 2003-09-30 devnull *l = p->next;
113 76193d7c 2003-09-30 devnull if(*l == nil)
114 76193d7c 2003-09-30 devnull _threadpq.tail = l;
115 76193d7c 2003-09-30 devnull break;
116 76193d7c 2003-09-30 devnull }
117 76193d7c 2003-09-30 devnull }
118 32f69c36 2003-12-11 devnull _threadprocs--;
119 76193d7c 2003-09-30 devnull unlock(&_threadpq.lock);
120 76193d7c 2003-09-30 devnull
121 76193d7c 2003-09-30 devnull strncpy(ex, p->exitstr, sizeof ex);
122 76193d7c 2003-09-30 devnull ex[sizeof ex-1] = '\0';
123 76193d7c 2003-09-30 devnull free(p);
124 76193d7c 2003-09-30 devnull _exit(ex[0]);
125 76193d7c 2003-09-30 devnull }
126 76193d7c 2003-09-30 devnull
127 76193d7c 2003-09-30 devnull int
128 76193d7c 2003-09-30 devnull nrand(int n)
129 76193d7c 2003-09-30 devnull {
130 76193d7c 2003-09-30 devnull return random()%n;
131 76193d7c 2003-09-30 devnull }
132 76193d7c 2003-09-30 devnull
133 76193d7c 2003-09-30 devnull void
134 76193d7c 2003-09-30 devnull _systhreadinit(void)
135 76193d7c 2003-09-30 devnull {
136 76193d7c 2003-09-30 devnull }
137 76193d7c 2003-09-30 devnull
138 76193d7c 2003-09-30 devnull void
139 76193d7c 2003-09-30 devnull threadstats(void)
140 76193d7c 2003-09-30 devnull {
141 76193d7c 2003-09-30 devnull extern int _threadnrendez, _threadhighnrendez,
142 76193d7c 2003-09-30 devnull _threadnalt, _threadhighnentry;
143 76193d7c 2003-09-30 devnull fprint(2, "*** THREAD LIBRARY STATS ***\n");
144 76193d7c 2003-09-30 devnull fprint(2, "nrendez %d high simultaneous %d\n",
145 76193d7c 2003-09-30 devnull _threadnrendez, _threadhighnrendez);
146 76193d7c 2003-09-30 devnull fprint(2, "nalt %d high simultaneous entry %d\n",
147 76193d7c 2003-09-30 devnull _threadnalt, _threadhighnentry);
148 76193d7c 2003-09-30 devnull }