1*86d7f5d3SJohn Marino /*
2*86d7f5d3SJohn Marino * quicksw1.c
3*86d7f5d3SJohn Marino *
4*86d7f5d3SJohn Marino * $DragonFly: src/test/sysperf/quicksw1.c,v 1.1 2003/08/12 02:29:44 dillon Exp $
5*86d7f5d3SJohn Marino */
6*86d7f5d3SJohn Marino
7*86d7f5d3SJohn Marino #include "blib.h"
8*86d7f5d3SJohn Marino
9*86d7f5d3SJohn Marino void qswitch(int **oldsw, int *newsw);
10*86d7f5d3SJohn Marino void qstart(int *newsw);
11*86d7f5d3SJohn Marino int *qinit(void *topstk, void *func, void *arg);
12*86d7f5d3SJohn Marino
13*86d7f5d3SJohn Marino static void do_task1(void *arg);
14*86d7f5d3SJohn Marino static void do_task2(void *arg);
15*86d7f5d3SJohn Marino
16*86d7f5d3SJohn Marino int *task1;
17*86d7f5d3SJohn Marino int *task2;
18*86d7f5d3SJohn Marino char stk1[16384];
19*86d7f5d3SJohn Marino char stk2[16384];
20*86d7f5d3SJohn Marino int count;
21*86d7f5d3SJohn Marino
22*86d7f5d3SJohn Marino int
main(int ac,char ** av)23*86d7f5d3SJohn Marino main(int ac, char **av)
24*86d7f5d3SJohn Marino {
25*86d7f5d3SJohn Marino #if USE_ALL
26*86d7f5d3SJohn Marino printf("userthread switching test (nonfp) using pushal/popal\n");
27*86d7f5d3SJohn Marino #elif USE_CALLU1
28*86d7f5d3SJohn Marino printf("userthread switching test (nonfp) using pushl (call-save only)\n");
29*86d7f5d3SJohn Marino #elif USE_CALLU2
30*86d7f5d3SJohn Marino printf("userthread switching test (nonfp) using subl $N,%%esp;movl (call-save only)\n");
31*86d7f5d3SJohn Marino #else
32*86d7f5d3SJohn Marino #error "The switch method wasn't defined with -D"
33*86d7f5d3SJohn Marino #endif
34*86d7f5d3SJohn Marino
35*86d7f5d3SJohn Marino task1 = qinit(stk1 + sizeof(stk1), do_task1, NULL);
36*86d7f5d3SJohn Marino task2 = qinit(stk2 + sizeof(stk2), do_task2, NULL);
37*86d7f5d3SJohn Marino start_timing();
38*86d7f5d3SJohn Marino qstart(task1);
39*86d7f5d3SJohn Marino }
40*86d7f5d3SJohn Marino
41*86d7f5d3SJohn Marino static void
do_task1(void * arg)42*86d7f5d3SJohn Marino do_task1(void *arg)
43*86d7f5d3SJohn Marino {
44*86d7f5d3SJohn Marino for (;;) {
45*86d7f5d3SJohn Marino qswitch(&task1, task2);
46*86d7f5d3SJohn Marino if (++count > 10000000) {
47*86d7f5d3SJohn Marino stop_timing(count, "uthread_switch");
48*86d7f5d3SJohn Marino exit(0);
49*86d7f5d3SJohn Marino }
50*86d7f5d3SJohn Marino }
51*86d7f5d3SJohn Marino }
52*86d7f5d3SJohn Marino
53*86d7f5d3SJohn Marino static void
do_task2(void * arg)54*86d7f5d3SJohn Marino do_task2(void *arg)
55*86d7f5d3SJohn Marino {
56*86d7f5d3SJohn Marino for (;;) {
57*86d7f5d3SJohn Marino ++count;
58*86d7f5d3SJohn Marino qswitch(&task2, task1);
59*86d7f5d3SJohn Marino }
60*86d7f5d3SJohn Marino }
61*86d7f5d3SJohn Marino
62