Blob


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