Sync sysperf with some random stuff, and add a cld instruction tester.
[dragonfly.git] / test / sysperf / mutex4.c
1 /*
2  * mutex4.c
3  *
4  * $DragonFly: src/test/sysperf/mutex4.c,v 1.1 2008/05/09 15:49:42 dillon Exp $
5  */
6
7 #include "blib.h"
8
9 #include <sys/types.h>
10 #include <machine/atomic.h>
11 #include <machine/cpufunc.h>
12
13 struct globaldata {
14         int gd_cpumask;
15         int gd_spinlocks;
16 };
17
18 int *mtx;
19 struct globaldata gd;
20
21 typedef struct globaldata *globaldata_t;
22
23 void
24 rd_lock_contested(void)
25 {
26 }
27
28 static __inline void
29 rd_lock(void)
30 {
31         atomic_set_int(mtx, 1);
32         *mtx = 2;
33         *mtx = 3;
34 }
35
36 static __inline void
37 rd_unlock(void)
38 {
39 }
40
41 int
42 main(int ac, char **av)
43 {
44     long long count = 0;
45     long long max;
46     int j;
47     int *counter;
48     pid_t pid;
49
50     printf("Test simple locked bus cycle mutex latency\n");
51     printf("auto-forks two processes for the test with shared memory\n");
52     printf("This test is only useful on a SMP box\n");
53
54     start_timing();
55     mtx = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
56     counter = mtx + 64;
57     gd.gd_cpumask = 0x00000001;
58     gd.gd_spinlocks = 0;
59     while (stop_timing(0, NULL) == 0) {
60         for (j = 0; j < 100; ++j) {
61             rd_lock();
62             rd_unlock();
63         }
64         count += 100;
65     }
66     max = count;
67     *mtx = 0;
68
69     start_timing();
70     for (count = 0; count < max; count += 100) {
71         for (j = 0; j < 100; ++j) {
72             rd_lock();
73             rd_unlock();        /* release */
74         }
75     }
76     stop_timing(count, "complex_mtx(uncontested/1cpu)");
77
78     if ((pid = fork()) == 0) {
79         for (;;) {
80             for (j = 0; j < 100; ++j) {
81                 rd_lock();
82                 rd_unlock();    /* release */
83                 ++counter[128];
84             }
85         }
86     } else {
87         gd.gd_cpumask = 0x00000002;
88         gd.gd_spinlocks = 0;
89         start_timing();
90         for (count = 0; count < max; count += 100) {
91             for (j = 0; j < 100; ++j) {
92                 rd_lock();
93                 rd_unlock();    /* release */
94                 ++counter[64];
95             }
96         }
97         stop_timing(count, "complex_mtx");
98         printf("proc1=%d proc2=%d\n", counter[64], counter[128]);
99         kill(pid, 9);
100     }
101     return(0);
102 }
103