mirror of
https://github.com/MariaDB/server.git
synced 2025-02-02 03:51:50 +01:00
Write better timing code for trylock. Refs #1738.
git-svn-id: file:///svn/toku/tokudb@11672 c7de825b-a66e-492c-adef-691d508d4ae1
This commit is contained in:
parent
0124e8fe7d
commit
a9b8ed234c
3 changed files with 133 additions and 3 deletions
|
@ -1,3 +1,4 @@
|
|||
CFLAGS=-O2 -Wall -W -Werror -D_GNU_SOURCE
|
||||
CPPFLAGS= -D_GNU_SOURCE -I../../toku_include
|
||||
CFLAGS=-O2 -Wall -W -Werror
|
||||
LDFLAGS=-lpthread
|
||||
trylock:
|
||||
default: trylock trylock-rdtsc mfence-benchmark process_locks pthread-locks
|
||||
|
|
|
@ -107,7 +107,7 @@ int main (int argc __attribute__((__unused__)),
|
|||
char *argv[] __attribute__((__unused__))) {
|
||||
int x[4];
|
||||
int i;
|
||||
for (i=0; i<2; i++) {
|
||||
for (i=0; i<4; i++) {
|
||||
do1(x);
|
||||
domfence(x);
|
||||
dosfence(x);
|
||||
|
|
129
newbrt/locking-benchmarks/trylock-rdtsc.c
Normal file
129
newbrt/locking-benchmarks/trylock-rdtsc.c
Normal file
|
@ -0,0 +1,129 @@
|
|||
/* Like trylock, except use rdstc */
|
||||
#define _MULTI_THREADED
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
#include <rdtsc.h>
|
||||
|
||||
float tdiff (struct timeval *start, struct timeval *end) {
|
||||
return 1e6*(end->tv_sec-start->tv_sec) +(end->tv_usec - start->tv_usec);
|
||||
}
|
||||
|
||||
unsigned long long rtdiff (unsigned long long a, unsigned long long b) {
|
||||
return (b-a);
|
||||
}
|
||||
|
||||
/* Simple function to check the return code and exit the program
|
||||
if the function call failed
|
||||
*/
|
||||
static void compResults(char *string, int rc) {
|
||||
if (rc) {
|
||||
printf("Error on : %s, rc=%d",
|
||||
string, rc);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
|
||||
|
||||
void *rdlockThread(void *arg __attribute__((unused)))
|
||||
{
|
||||
int rc;
|
||||
int count=0;
|
||||
|
||||
unsigned long long t_start, t_end;
|
||||
|
||||
printf("Entered thread, getting read lock with mp wait\n");
|
||||
Retry:
|
||||
|
||||
t_start = rdtsc();
|
||||
rc = pthread_rwlock_tryrdlock(&rwlock);
|
||||
t_end = rdtsc();
|
||||
printf("pthread_rwlock_tryrdlock took %llu clocks\n", rtdiff(t_start,t_end));
|
||||
if (rc == EBUSY) {
|
||||
if (count >= 10) {
|
||||
printf("Retried too many times, failure!\n");
|
||||
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
++count;
|
||||
printf("Could not get lock, do other work, then RETRY...\n");
|
||||
sleep(1);
|
||||
goto Retry;
|
||||
}
|
||||
compResults("pthread_rwlock_tryrdlock() 1\n", rc);
|
||||
|
||||
sleep(2);
|
||||
|
||||
printf("unlock the read lock\n");
|
||||
t_start = rdtsc();
|
||||
rc = pthread_rwlock_unlock(&rwlock);
|
||||
t_end = rdtsc();
|
||||
compResults("pthread_rwlock_unlock()\n", rc);
|
||||
printf("%llu to %llu is %llu clocks\n", t_start, t_end, rtdiff(t_start, t_end));
|
||||
|
||||
printf("Secondary thread complete\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int main(int argc __attribute__((unused)), char **argv)
|
||||
{
|
||||
int rc=0;
|
||||
pthread_t thread;
|
||||
unsigned long long t_start, t_end;
|
||||
|
||||
printf("Enter Testcase - %s\n", argv[0]);
|
||||
|
||||
t_start = rdtsc();
|
||||
t_end = rdtsc();
|
||||
printf("nop Took %llu clocks\n", rtdiff(t_start, t_end));
|
||||
|
||||
{
|
||||
int N=1000;
|
||||
int i;
|
||||
printf("Main, get and release the write lock %d times\n", N);
|
||||
t_start = rdtsc();
|
||||
for (i=0; i<N; i++) {
|
||||
rc = pthread_rwlock_wrlock(&rwlock);
|
||||
rc = pthread_rwlock_unlock(&rwlock);
|
||||
}
|
||||
t_end = rdtsc();
|
||||
compResults("pthread_rwlock_wrlock()\n", rc);
|
||||
printf("Took %5.2f clocks/op\n", ((double)(t_end-t_start))/N);
|
||||
}
|
||||
|
||||
printf("Main, get the write lock\n");
|
||||
t_start = rdtsc();
|
||||
rc = pthread_rwlock_wrlock(&rwlock);
|
||||
t_end = rdtsc();
|
||||
compResults("pthread_rwlock_wrlock()\n", rc);
|
||||
printf("Took %llu clocks\n", rtdiff(t_start, t_end));
|
||||
|
||||
printf("Main, create the try read lock thread\n");
|
||||
rc = pthread_create(&thread, NULL, rdlockThread, NULL);
|
||||
compResults("pthread_create\n", rc);
|
||||
|
||||
printf("Main, wait a bit holding the write lock\n");
|
||||
sleep(5);
|
||||
|
||||
printf("Main, Now unlock the write lock\n");
|
||||
t_start = rdtsc();
|
||||
rc = pthread_rwlock_unlock(&rwlock);
|
||||
t_end = rdtsc();
|
||||
compResults("pthread_rwlock_unlock()\n", rc);
|
||||
printf("Took %llu clocks\n", rtdiff(t_start, t_end));
|
||||
|
||||
printf("Main, wait for the thread to end\n");
|
||||
rc = pthread_join(thread, NULL);
|
||||
compResults("pthread_join\n", rc);
|
||||
|
||||
rc = pthread_rwlock_destroy(&rwlock);
|
||||
compResults("pthread_rwlock_destroy()\n", rc);
|
||||
printf("Main completed\n");
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue