1 /* Locking performance tests. Gives locsk&unlocks/second. */
14 #define MAX_LOCKS 471234567
17 SilcUInt64 cpu_freq = 0;
18 int max_locks, max_locks2;
19 SilcTimerStruct timer;
21 #define rdtsc() silc_timer_tick(&timer, FALSE)
23 void *mutex_thread(void *context)
30 for (i = 0; i < max_locks; i++) {
31 silc_mutex_lock(mutex);
32 silc_mutex_unlock(mutex);
34 c->time = rdtsc() - s;
44 void *mutex_thread_hold(void *context)
51 for (i = 0; i < max_locks / 4; i++) {
52 silc_mutex_lock(mutex);
59 if (silc_unlikely(hval3 != hval2 + i + hval)) {
60 fprintf(stderr, "MUTEX CORRUPT 1\n");
63 if (silc_unlikely(hval2 != i)) {
64 fprintf(stderr, "MUTEX CORRUPT 2 (%llu != %d)\n", hval2, i);
67 silc_mutex_unlock(mutex);
69 c->time = rdtsc() - s;
75 int main(int argc, char **argv)
77 Context c[MAX_THREADS * MAX_MUL];
82 silc_timer_synchronize(&timer);
86 val /= 1000; /* Gives us milliseconds */
87 fprintf(stderr, "CPU frequency: %llu\n", val);
89 max_locks = MAX_LOCKS;
91 fprintf(stderr, "lock/unlock per second\n");
93 for (j = 0; j < MAX_ROUND; j++) {
94 for (i = 0; i < 1; i++)
95 c[i].thread = silc_thread_create(mutex_thread, &c[i], TRUE);
98 for (i = 0; i < 1; i++) {
99 silc_thread_wait(c[i].thread, NULL);
102 fprintf(stderr, "%llu mutex lock/unlock per second (%d threads)\n",
103 (1000LL * max_locks * 1) / val, 1);
106 /* If MAX_LOCKS is too large for this CPU, optimize. We don't want to
107 wait a whole day for this test. */
108 if ((SilcInt64)(max_locks / 10) >
109 (SilcInt64)((1000LL * max_locks) / val))
116 max_locks2 = max_locks;
117 for (k = 0; k < MAX_MUL; k++) {
119 max_locks = max_locks2 / (k + 1);
120 for (j = 0; j < MAX_ROUND; j++) {
121 for (i = 0; i < MAX_THREADS * (k + 1); i++)
122 c[i].thread = silc_thread_create(mutex_thread, &c[i], TRUE);
125 for (i = 0; i < MAX_THREADS * (k + 1); i++) {
126 silc_thread_wait(c[i].thread, NULL);
129 fprintf(stderr, "%llu mutex lock/unlock per second (%d threads)\n",
130 (1000LL * max_locks * (MAX_THREADS * (k + 1))) / val,
131 MAX_THREADS * (k + 1));
135 max_locks = max_locks2;
137 fprintf(stderr, "Spinning/holding lock, lock/unlock per second\n");
141 for (j = 0; j < MAX_ROUND / 2; j++) {
142 for (i = 0; i < 1; i++)
143 c[i].thread = silc_thread_create(mutex_thread_hold, &c[i], TRUE);
146 for (i = 0; i < 1; i++) {
147 silc_thread_wait(c[i].thread, NULL);
150 fprintf(stderr, "%llu mutex lock/unlock per second (%d threads)\n",
151 (1000LL * (max_locks / 4) * 1) / val, 1);
155 max_locks2 = max_locks;
157 for (k = 0; k < MAX_MUL; k++) {
159 max_locks = max_locks2 / (k + 1);
160 for (j = 0; j < MAX_ROUND / 2; j++) {
162 for (i = 0; i < MAX_THREADS * (k + 1); i++)
163 c[i].thread = silc_thread_create(mutex_thread_hold, &c[i], TRUE);
166 for (i = 0; i < MAX_THREADS * (k + 1); i++) {
167 silc_thread_wait(c[i].thread, NULL);
170 fprintf(stderr, "%llu mutex lock/unlock per second (%d threads)\n",
171 (1000LL * (max_locks / 4) *
172 (MAX_THREADS * (k + 1))) / val,
173 MAX_THREADS * (k + 1));
180 fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");