1*86d7f5d3SJohn Marino /*
2*86d7f5d3SJohn Marino * mutex1.c
3*86d7f5d3SJohn Marino *
4*86d7f5d3SJohn Marino * $DragonFly: src/test/sysperf/mutex1.c,v 1.2 2006/04/22 22:34:06 dillon Exp $
5*86d7f5d3SJohn Marino */
6*86d7f5d3SJohn Marino
7*86d7f5d3SJohn Marino #include "blib.h"
8*86d7f5d3SJohn Marino
9*86d7f5d3SJohn Marino int *mtx;
10*86d7f5d3SJohn Marino
11*86d7f5d3SJohn Marino int
main(int ac,char ** av)12*86d7f5d3SJohn Marino main(int ac, char **av)
13*86d7f5d3SJohn Marino {
14*86d7f5d3SJohn Marino long long count = 0;
15*86d7f5d3SJohn Marino long long max;
16*86d7f5d3SJohn Marino int j;
17*86d7f5d3SJohn Marino int *counter;
18*86d7f5d3SJohn Marino pid_t pid;
19*86d7f5d3SJohn Marino
20*86d7f5d3SJohn Marino printf("Test simple locked bus cycle mutex latency\n");
21*86d7f5d3SJohn Marino printf("auto-forks two processes for the test with shared memory\n");
22*86d7f5d3SJohn Marino printf("This test is only useful on a SMP box\n");
23*86d7f5d3SJohn Marino
24*86d7f5d3SJohn Marino start_timing();
25*86d7f5d3SJohn Marino mtx = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
26*86d7f5d3SJohn Marino counter = mtx + 64;
27*86d7f5d3SJohn Marino while (stop_timing(0, NULL) == 0) {
28*86d7f5d3SJohn Marino for (j = 0; j < 100; ++j) {
29*86d7f5d3SJohn Marino try_spin_mtx();
30*86d7f5d3SJohn Marino rel_spin_mtx();
31*86d7f5d3SJohn Marino }
32*86d7f5d3SJohn Marino count += 100;
33*86d7f5d3SJohn Marino }
34*86d7f5d3SJohn Marino max = count;
35*86d7f5d3SJohn Marino *mtx = 0;
36*86d7f5d3SJohn Marino
37*86d7f5d3SJohn Marino /*
38*86d7f5d3SJohn Marino * Single cpu case
39*86d7f5d3SJohn Marino */
40*86d7f5d3SJohn Marino start_timing();
41*86d7f5d3SJohn Marino for (count = 0; count < max; count += 100) {
42*86d7f5d3SJohn Marino for (j = 0; j < 100; ++j) {
43*86d7f5d3SJohn Marino while (try_spin_mtx() != 0)
44*86d7f5d3SJohn Marino ;
45*86d7f5d3SJohn Marino rel_spin_mtx(); /* release */
46*86d7f5d3SJohn Marino ++counter[64];
47*86d7f5d3SJohn Marino }
48*86d7f5d3SJohn Marino }
49*86d7f5d3SJohn Marino stop_timing(count, "simple_mtx(uncontested/1cpu)");
50*86d7f5d3SJohn Marino
51*86d7f5d3SJohn Marino if ((pid = fork()) == 0) {
52*86d7f5d3SJohn Marino for (;;) {
53*86d7f5d3SJohn Marino for (j = 0; j < 100; ++j) {
54*86d7f5d3SJohn Marino while (try_spin_mtx() != 0)
55*86d7f5d3SJohn Marino ;
56*86d7f5d3SJohn Marino rel_spin_mtx(); /* release */
57*86d7f5d3SJohn Marino ++counter[128];
58*86d7f5d3SJohn Marino }
59*86d7f5d3SJohn Marino }
60*86d7f5d3SJohn Marino } else {
61*86d7f5d3SJohn Marino start_timing();
62*86d7f5d3SJohn Marino for (count = 0; count < max; count += 100) {
63*86d7f5d3SJohn Marino for (j = 0; j < 100; ++j) {
64*86d7f5d3SJohn Marino while (try_spin_mtx() != 0)
65*86d7f5d3SJohn Marino ;
66*86d7f5d3SJohn Marino rel_spin_mtx(); /* release */
67*86d7f5d3SJohn Marino ++counter[64];
68*86d7f5d3SJohn Marino }
69*86d7f5d3SJohn Marino }
70*86d7f5d3SJohn Marino stop_timing(count, "simple_mtx");
71*86d7f5d3SJohn Marino printf("proc1=%d proc2=%d\n", counter[64], counter[128]);
72*86d7f5d3SJohn Marino kill(pid, 9);
73*86d7f5d3SJohn Marino }
74*86d7f5d3SJohn Marino return(0);
75*86d7f5d3SJohn Marino }
76*86d7f5d3SJohn Marino
77