X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Ftests%2Ftest_silcmutex.c;h=ffe17bd66762e2b6f8807a8fe2f2628207f05f6d;hp=1b4da6186a2262cc84784ca76b5a8da702399370;hb=e7b6c157b80152bf9fb9266e6bdd93f9fb0db776;hpb=6bc07a1a4175d3630257f8f6ae149ee0a1cdd3d9 diff --git a/lib/silcutil/tests/test_silcmutex.c b/lib/silcutil/tests/test_silcmutex.c index 1b4da618..ffe17bd6 100644 --- a/lib/silcutil/tests/test_silcmutex.c +++ b/lib/silcutil/tests/test_silcmutex.c @@ -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 \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;