3 #include "threadimpl.h"
5 typedef struct Mainarg Mainarg;
15 static void mainlauncher(void*);
16 extern void (*_sysfatal)(char*, va_list);
28 extern char *_threadexitsallstatus;
31 if(_threadexitsallstatus)
32 exit(_threadexitsallstatus[0] ? 1 : 0);
42 main(int argc, char **argv)
47 signal(SIGTERM, _threaddie);
48 signal(SIGCHLD, _nop);
49 signal(SIGALRM, _nop);
50 // signal(SIGINFO, _threadstatus);
53 //_threaddebuglevel = (DBGSCHED|DBGCHAN|DBGREND)^~0;
55 _qlockinit(_threadrendezvous);
56 _sysfatal = _threadsysfatal;
58 if(mainstacksize == 0)
59 mainstacksize = 32*1024;
61 a = _threadmalloc(sizeof *a, 1);
65 p = _newproc(mainlauncher, a, mainstacksize, "threadmain", 0, 0);
67 abort(); /* not reached */
72 mainlauncher(void *arg)
77 threadmain(a->argc, a->argv);
78 threadexits("threadmain");
87 _threadsignalpasser(void)
96 pid = ffork(RFMEM|RFNOWAIT, _schedinit, p);
109 lock(&_threadpq.lock);
110 for(l=&_threadpq.head; *l; l=&(*l)->next){
119 unlock(&_threadpq.lock);
121 strncpy(ex, p->exitstr, sizeof ex);
122 ex[sizeof ex-1] = '\0';
141 extern int _threadnrendez, _threadhighnrendez,
142 _threadnalt, _threadhighnentry;
143 fprint(2, "*** THREAD LIBRARY STATS ***\n");
144 fprint(2, "nrendez %d high simultaneous %d\n",
145 _threadnrendez, _threadhighnrendez);
146 fprint(2, "nalt %d high simultaneous entry %d\n",
147 _threadnalt, _threadhighnentry);