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"
5 76193d7c 2003-09-30 devnull typedef struct Mainarg Mainarg;
6 76193d7c 2003-09-30 devnull struct Mainarg
9 76193d7c 2003-09-30 devnull char **argv;
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);
19 02a1a5c1 2004-03-05 devnull _threadstatus(int x)
22 02a1a5c1 2004-03-05 devnull threadstatus();
26 76193d7c 2003-09-30 devnull _threaddie(int x)
28 76193d7c 2003-09-30 devnull extern char *_threadexitsallstatus;
31 76193d7c 2003-09-30 devnull if(_threadexitsallstatus)
32 73bef9b7 2004-08-11 devnull _exits(_threadexitsallstatus);
36 76193d7c 2003-09-30 devnull main(int argc, char **argv)
38 76193d7c 2003-09-30 devnull Mainarg *a;
41 76193d7c 2003-09-30 devnull //_threaddebuglevel = (DBGSCHED|DBGCHAN|DBGREND)^~0;
42 76193d7c 2003-09-30 devnull _systhreadinit();
43 06bb4ed2 2004-09-17 devnull _qlockinit(_threadsleep, _threadwakeup);
44 76193d7c 2003-09-30 devnull _sysfatal = _threadsysfatal;
45 32f69c36 2003-12-11 devnull notify(_threadnote);
46 76193d7c 2003-09-30 devnull if(mainstacksize == 0)
47 76193d7c 2003-09-30 devnull mainstacksize = 32*1024;
49 76193d7c 2003-09-30 devnull a = _threadmalloc(sizeof *a, 1);
50 76193d7c 2003-09-30 devnull a->argc = argc;
51 76193d7c 2003-09-30 devnull a->argv = argv;
52 76193d7c 2003-09-30 devnull p = _newproc(mainlauncher, a, mainstacksize, "threadmain", 0, 0);
53 76193d7c 2003-09-30 devnull _schedinit(p);
54 76193d7c 2003-09-30 devnull abort(); /* not reached */
55 76193d7c 2003-09-30 devnull return 0;
58 76193d7c 2003-09-30 devnull static void
59 76193d7c 2003-09-30 devnull mainlauncher(void *arg)
61 76193d7c 2003-09-30 devnull Mainarg *a;
64 76193d7c 2003-09-30 devnull threadmain(a->argc, a->argv);
65 76193d7c 2003-09-30 devnull threadexits("threadmain");
69 76193d7c 2003-09-30 devnull _threadsignal(void)
74 76193d7c 2003-09-30 devnull _threadsignalpasser(void)
79 76193d7c 2003-09-30 devnull _schedfork(Proc *p)
82 cd7ddc9b 2003-11-23 devnull lock(&p->lock);
83 cd7ddc9b 2003-11-23 devnull pid = ffork(RFMEM|RFNOWAIT, _schedinit, p);
84 cd7ddc9b 2003-11-23 devnull p->pid = pid;
85 cd7ddc9b 2003-11-23 devnull unlock(&p->lock);
86 cd7ddc9b 2003-11-23 devnull return pid;
91 76193d7c 2003-09-30 devnull _schedexit(Proc *p)
93 76193d7c 2003-09-30 devnull char ex[ERRMAX];
94 76193d7c 2003-09-30 devnull Proc **l;
96 76193d7c 2003-09-30 devnull lock(&_threadpq.lock);
97 76193d7c 2003-09-30 devnull for(l=&_threadpq.head; *l; l=&(*l)->next){
98 76193d7c 2003-09-30 devnull if(*l == p){
99 76193d7c 2003-09-30 devnull *l = p->next;
100 76193d7c 2003-09-30 devnull if(*l == nil)
101 76193d7c 2003-09-30 devnull _threadpq.tail = l;
105 32f69c36 2003-12-11 devnull _threadprocs--;
106 76193d7c 2003-09-30 devnull unlock(&_threadpq.lock);
108 76193d7c 2003-09-30 devnull strncpy(ex, p->exitstr, sizeof ex);
109 76193d7c 2003-09-30 devnull ex[sizeof ex-1] = '\0';
110 76193d7c 2003-09-30 devnull free(p);
111 73bef9b7 2004-08-11 devnull _exits(ex);
115 76193d7c 2003-09-30 devnull nrand(int n)
117 76193d7c 2003-09-30 devnull return random()%n;
121 76193d7c 2003-09-30 devnull _systhreadinit(void)
126 76193d7c 2003-09-30 devnull threadstats(void)
128 76193d7c 2003-09-30 devnull extern int _threadnrendez, _threadhighnrendez,
129 76193d7c 2003-09-30 devnull _threadnalt, _threadhighnentry;
130 76193d7c 2003-09-30 devnull fprint(2, "*** THREAD LIBRARY STATS ***\n");
131 76193d7c 2003-09-30 devnull fprint(2, "nrendez %d high simultaneous %d\n",
132 76193d7c 2003-09-30 devnull _threadnrendez, _threadhighnrendez);
133 76193d7c 2003-09-30 devnull fprint(2, "nalt %d high simultaneous entry %d\n",
134 76193d7c 2003-09-30 devnull _threadnalt, _threadhighnentry);