Blame


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