#define MAX_ROUND 8
#define MAX_MUL 4
#define MAX_THREADS 4
-#define MAX_LOCKS 271234567
+#define MAX_LOCKS 471234567
SilcMutex mutex;
SilcUInt64 cpu_freq = 0;
int max_locks, max_locks2;
+SilcTimerStruct timer;
-/* RDTSC */
-#ifdef SILC_I486
-static __inline__ unsigned long long rdtsc(void)
-{
- unsigned long long int x;
- __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
- return x;
-}
-
-#elif SILC_X86_64
-typedef unsigned long long int unsigned long long;
-static __inline__ unsigned long long rdtsc(void)
-{
- unsigned hi, lo;
- __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
- return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
-}
-
-#elif SILC_POWERPC
-typedef unsigned long long int unsigned long long;
-static __inline__ unsigned long long rdtsc(void)
-{
- unsigned long long int result = 0;
- unsigned long int upper, lower,tmp;
- __asm__ volatile(
- "0: \n"
- "\tmftbu %0 \n"
- "\tmftb %1 \n"
- "\tmftbu %2 \n"
- "\tcmpw %2,%0 \n"
- "\tbne 0b \n"
- : "=r"(upper),"=r"(lower),"=r"(tmp)
- );
- result = upper;
- result = result << 32;
- result = result | lower;
-
- return result;
-}
-#endif
+#define rdtsc() silc_timer_tick(&timer, FALSE)
void *mutex_thread(void *context)
{
silc_mutex_lock(mutex);
hval2 = i;
hval3 = 0;
- hval += hval;
+ hval++;
hval3 = hval2 + i;
- if (hval > max_locks)
- hval = 0;
- if (hval < max_locks)
- hval = max_locks;
- hval += hval;
+ hval += hval2;
hval3 += hval;
if (silc_unlikely(hval3 != hval2 + i + hval)) {
fprintf(stderr, "MUTEX CORRUPT 1\n");
int k, i, j, o = 0;
SilcBool success;
- if (argc <= 1) {
- fprintf(stderr, "Usage: ./test_silcmutex <cpu_freq_mhz>\n");
- fprintf(stderr, "Example: ./test_silcmutex 3000\n");
- exit(1);
- }
- cpu_freq = (SilcUInt64)atoi(argv[1]);
- cpu_freq *= 1000; /* Will give us milliseconds */
+ silc_timer_synchronize(&timer);
+ val = rdtsc();
+ sleep(1);
+ val = rdtsc() - val;
+ val /= 1000; /* Gives us milliseconds */
+ fprintf(stderr, "CPU frequency: %llu\n", val);
max_locks = MAX_LOCKS;
fprintf(stderr, "Spinning/holding lock, lock/unlock per second\n");
- sleep(16);
- for (j = 0; j < MAX_ROUND; j++) {
+ max_locks /= 2;
+ sleep(5);
+ for (j = 0; j < MAX_ROUND / 2; j++) {
for (i = 0; i < 1; i++)
c[i].thread = silc_thread_create(mutex_thread_hold, &c[i], TRUE);
val += c[i].time;
}
fprintf(stderr, "%llu mutex lock/unlock per second (%d threads)\n",
- (1000LL * (max_locks / 4)) / val, 1);
+ (1000LL * (max_locks / 4) * 1) / val, 1);
}
puts("");
max_locks2 = max_locks;
+ max_locks2 /= 2;
for (k = 0; k < MAX_MUL; k++) {
- sleep(16);
+ sleep(2);
max_locks = max_locks2 / (k + 1);
- for (j = 0; j < MAX_ROUND; j++) {
+ for (j = 0; j < MAX_ROUND / 2; j++) {
hval = hval2 = 1;
for (i = 0; i < MAX_THREADS * (k + 1); i++)
- c[i].thread = silc_thread_create(mutex_thread, &c[i], TRUE);
+ c[i].thread = silc_thread_create(mutex_thread_hold, &c[i], TRUE);
val = 0;
for (i = 0; i < MAX_THREADS * (k + 1); i++) {
- silc_thread_wait(c[i].thread, NULL);
- val += c[i].time;
+ silc_thread_wait(c[i].thread, NULL);
+ val += c[i].time;
}
fprintf(stderr, "%llu mutex lock/unlock per second (%d threads)\n",
- (1000LL * (max_locks / 4) *
- (MAX_THREADS * (k + 1))) / val,
- MAX_THREADS * (k + 1));
+ (1000LL * (max_locks / 4) *
+ (MAX_THREADS * (k + 1))) / val,
+ MAX_THREADS * (k + 1));
}
puts("");
}
- max_locks = max_locks2;
success = TRUE;