updates.
[silc.git] / lib / silcutil / tests / test_silcmutex.c
index 1b4da6186a2262cc84784ca76b5a8da702399370..ffe17bd66762e2b6f8807a8fe2f2628207f05f6d 100644 (file)
@@ -11,52 +11,14 @@ typedef struct {
 #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)
 {
@@ -90,13 +52,9 @@ void *mutex_thread_hold(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");
@@ -121,13 +79,12 @@ int main(int argc, char **argv)
   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;
 
@@ -179,8 +136,9 @@ int main(int argc, char **argv)
 
   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);
 
@@ -190,32 +148,32 @@ int main(int argc, char **argv)
       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;