From 8492622b53e549bda558ca042e9b5a321e57243c Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Sat, 12 Mar 2011 14:02:06 +0000 Subject: [PATCH] Added --free-is-write stress test. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11634 --- drd/tests/Makefile.am | 3 ++ drd/tests/free_is_write.c | 70 ++++++++++++++++++++++++++++++ drd/tests/free_is_write.stderr.exp | 4 ++ drd/tests/free_is_write.vgtest | 4 ++ 4 files changed, 81 insertions(+) create mode 100644 drd/tests/free_is_write.c create mode 100644 drd/tests/free_is_write.stderr.exp create mode 100644 drd/tests/free_is_write.vgtest diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index b936334ae1..665a428b5a 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -72,6 +72,8 @@ EXTRA_DIST = \ fp_race.vgtest \ fp_race2.stderr.exp \ fp_race2.vgtest \ + free_is_write.vgtest \ + free_is_write.stderr.exp \ hg01_all_ok.stderr.exp \ hg01_all_ok.vgtest \ hg02_deadlock.stderr.exp \ @@ -276,6 +278,7 @@ check_PROGRAMS = \ bug-235681 \ custom_alloc \ fp_race \ + free_is_write \ hold_lock \ linuxthreads_det \ memory_allocation \ diff --git a/drd/tests/free_is_write.c b/drd/tests/free_is_write.c new file mode 100644 index 0000000000..899a853a4c --- /dev/null +++ b/drd/tests/free_is_write.c @@ -0,0 +1,70 @@ +/* Stress test for the --free-is-write command-line option. */ + +#include +#include +#include +#include +#include +#include +#include + +#define MALLOC_SIZE 22816 +#define THREAD_COUNT 10 +#define MALLOC_COUNT 1000 + +static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +// 'mutex' protects 'count'. +static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +static unsigned count; + +void* thread_func(void* arg) +{ + unsigned i; + + for (i = 0; i < MALLOC_COUNT; ++i) { + void* ptr; + + ptr = malloc(MALLOC_SIZE); + memset(ptr, 0, MALLOC_SIZE); + free(ptr); + } + + pthread_mutex_lock(&mutex); + ++count; + pthread_cond_signal(&cond); + pthread_mutex_unlock(&mutex); + + return 0; +} + +int main(int argc, char **argv) +{ + pthread_t thread[THREAD_COUNT]; + int result; + int i; + + for (i = 0; i < THREAD_COUNT; i++) { + result = pthread_create(&thread[i], 0, thread_func, 0); + assert(result == 0); + } + + pthread_mutex_lock(&mutex); + while (count < THREAD_COUNT && pthread_cond_wait(&cond, &mutex) == 0) + ; + pthread_mutex_unlock(&mutex); + + for (i = 0; i < THREAD_COUNT; i++) + pthread_join(thread[i], 0); + + fflush(stdout); + + fprintf(stderr, "Done.\n"); + + return 0; +} + +/* + * Local variables: + * c-basic-offset: 2 + * End: + */ diff --git a/drd/tests/free_is_write.stderr.exp b/drd/tests/free_is_write.stderr.exp new file mode 100644 index 0000000000..d16127fb58 --- /dev/null +++ b/drd/tests/free_is_write.stderr.exp @@ -0,0 +1,4 @@ + +Done. + +ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) diff --git a/drd/tests/free_is_write.vgtest b/drd/tests/free_is_write.vgtest new file mode 100644 index 0000000000..9151098470 --- /dev/null +++ b/drd/tests/free_is_write.vgtest @@ -0,0 +1,4 @@ +prereq: test -e free_is_write && ./supported_libpthread +vgopts: --read-var-info=yes --free-is-write=yes --show-confl-seg=no +prog: free_is_write +args: -q -- 2.47.3