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 _exits(_threadexitsallstatus);
36 main(int argc, char **argv)
41 //_threaddebuglevel = (DBGSCHED|DBGCHAN|DBGREND)^~0;
43 _qlockinit(_threadsleep, _threadwakeup);
44 _sysfatal = _threadsysfatal;
46 if(mainstacksize == 0)
47 mainstacksize = 32*1024;
49 a = _threadmalloc(sizeof *a, 1);
52 p = _newproc(mainlauncher, a, mainstacksize, "threadmain", 0, 0);
54 abort(); /* not reached */
59 mainlauncher(void *arg)
64 threadmain(a->argc, a->argv);
65 threadexits("threadmain");
74 _threadsignalpasser(void)
83 pid = ffork(RFMEM|RFNOWAIT, _scheduler, p);
96 lock(&_threadpq.lock);
97 for(l=&_threadpq.head; *l; l=&(*l)->next){
106 unlock(&_threadpq.lock);
108 strncpy(ex, p->exitstr, sizeof ex);
109 ex[sizeof ex-1] = '\0';
128 extern int _threadnrendez, _threadhighnrendez,
129 _threadnalt, _threadhighnentry;
130 fprint(2, "*** THREAD LIBRARY STATS ***\n");
131 fprint(2, "nrendez %d high simultaneous %d\n",
132 _threadnrendez, _threadhighnrendez);
133 fprint(2, "nalt %d high simultaneous entry %d\n",
134 _threadnalt, _threadhighnentry);