xref: /dflybsd-src/test/sysperf/loop4.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1*86d7f5d3SJohn Marino /*
2*86d7f5d3SJohn Marino  * loop4.c
3*86d7f5d3SJohn Marino  *
4*86d7f5d3SJohn Marino  * Used to test syscall mpsafeness, with editing
5*86d7f5d3SJohn Marino  *
6*86d7f5d3SJohn Marino  * $DragonFly: src/test/sysperf/loop4.c,v 1.1 2008/05/09 15:49:42 dillon Exp $
7*86d7f5d3SJohn Marino  */
8*86d7f5d3SJohn Marino 
9*86d7f5d3SJohn Marino #include "blib.h"
10*86d7f5d3SJohn Marino #include <fcntl.h>
11*86d7f5d3SJohn Marino 
12*86d7f5d3SJohn Marino #define INNER 100
13*86d7f5d3SJohn Marino 
14*86d7f5d3SJohn Marino void doloop(int count);
15*86d7f5d3SJohn Marino void func_nop1(void);
16*86d7f5d3SJohn Marino void func_nop2(void);
17*86d7f5d3SJohn Marino 
18*86d7f5d3SJohn Marino int
main(int ac,char ** av)19*86d7f5d3SJohn Marino main(int ac, char **av)
20*86d7f5d3SJohn Marino {
21*86d7f5d3SJohn Marino     int i;
22*86d7f5d3SJohn Marino     int fd;
23*86d7f5d3SJohn Marino     int count;
24*86d7f5d3SJohn Marino     int nfork;
25*86d7f5d3SJohn Marino     pid_t pid;
26*86d7f5d3SJohn Marino 
27*86d7f5d3SJohn Marino     if (ac > 1)
28*86d7f5d3SJohn Marino 	nfork = strtoul(av[1], NULL, 0);
29*86d7f5d3SJohn Marino 
30*86d7f5d3SJohn Marino     printf("SMP contention, dup() + close(), Run just one\n");
31*86d7f5d3SJohn Marino 
32*86d7f5d3SJohn Marino     start_timing();
33*86d7f5d3SJohn Marino     count = 0;
34*86d7f5d3SJohn Marino     while (stop_timing(0, NULL) == 0) {
35*86d7f5d3SJohn Marino 	doloop(1000);
36*86d7f5d3SJohn Marino 	count += 1000;
37*86d7f5d3SJohn Marino     }
38*86d7f5d3SJohn Marino     printf("loop %d times\n", count);
39*86d7f5d3SJohn Marino 
40*86d7f5d3SJohn Marino     start_timing();
41*86d7f5d3SJohn Marino     for (i = 1; i < nfork; ++i) {
42*86d7f5d3SJohn Marino 	    if (fork() == 0) {
43*86d7f5d3SJohn Marino 		doloop(count);
44*86d7f5d3SJohn Marino 		_exit(1);
45*86d7f5d3SJohn Marino 	    }
46*86d7f5d3SJohn Marino     }
47*86d7f5d3SJohn Marino     doloop(count);
48*86d7f5d3SJohn Marino     while (wait(NULL) > 0)
49*86d7f5d3SJohn Marino 	;
50*86d7f5d3SJohn Marino     stop_timing(count * INNER, "loop2/2xfork");
51*86d7f5d3SJohn Marino     return(0);
52*86d7f5d3SJohn Marino }
53*86d7f5d3SJohn Marino 
54*86d7f5d3SJohn Marino void
doloop(int count)55*86d7f5d3SJohn Marino doloop(int count)
56*86d7f5d3SJohn Marino {
57*86d7f5d3SJohn Marino     int i;
58*86d7f5d3SJohn Marino     int j;
59*86d7f5d3SJohn Marino     int fd = open("/usr/share/dict/words", O_RDONLY);
60*86d7f5d3SJohn Marino     register void (*func)(void) = func_nop1;
61*86d7f5d3SJohn Marino 
62*86d7f5d3SJohn Marino     if (fd < 0)
63*86d7f5d3SJohn Marino 	perror("open");
64*86d7f5d3SJohn Marino     for (i = count; i > 0; --i) {
65*86d7f5d3SJohn Marino 	for (j = INNER; j > 0; --j) {
66*86d7f5d3SJohn Marino 		getuid();
67*86d7f5d3SJohn Marino 	}
68*86d7f5d3SJohn Marino     }
69*86d7f5d3SJohn Marino     close(fd);
70*86d7f5d3SJohn Marino }
71*86d7f5d3SJohn Marino 
72*86d7f5d3SJohn Marino void
func_nop1(void)73*86d7f5d3SJohn Marino func_nop1(void)
74*86d7f5d3SJohn Marino {
75*86d7f5d3SJohn Marino }
76*86d7f5d3SJohn Marino 
77*86d7f5d3SJohn Marino void
func_nop2(void)78*86d7f5d3SJohn Marino func_nop2(void)
79*86d7f5d3SJohn Marino {
80*86d7f5d3SJohn Marino }
81*86d7f5d3SJohn Marino 
82