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