diff options
author | Kostya Kortchinsky <kostyak@google.com> | 2017-03-23 19:21:10 +0000 |
---|---|---|
committer | Kostya Kortchinsky <kostyak@google.com> | 2017-03-23 19:21:10 +0000 |
commit | 16ed7295a5e6619e28c4bf93dba7b3b87e7ca2e3 (patch) | |
tree | 8cb1abe569e733fe0ae93af17ea4db038b2fd3d1 /test/scudo | |
parent | aaa8f43ba26653f9d0dd7da3a4bc8fe4bf717993 (diff) |
[scudo] Add test exercising pthreads
Summary: Scudo didn't have any test using multiple threads. Add one, borrowed from lsan.
Reviewers: kcc, alekseyshl
Reviewed By: alekseyshl
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D31297
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@298636 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/scudo')
-rw-r--r-- | test/scudo/threads.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/test/scudo/threads.cpp b/test/scudo/threads.cpp new file mode 100644 index 000000000..d9f4a86c1 --- /dev/null +++ b/test/scudo/threads.cpp @@ -0,0 +1,65 @@ +// RUN: %clang_scudo %s -o %t +// RUN: SCUDO_OPTIONS="QuarantineSizeMb=0:ThreadLocalQuarantineSizeKb=0" %run %t 5 1000000 2>&1 +// RUN: SCUDO_OPTIONS="QuarantineSizeMb=1:ThreadLocalQuarantineSizeKb=64" %run %t 5 1000000 2>&1 + +// Tests parallel allocations and deallocations of memory chunks from a number +// of concurrent threads, with and without quarantine. +// This test passes if everything executes properly without crashing. + +#include <assert.h> +#include <pthread.h> +#include <stdlib.h> +#include <stdio.h> + +#include <sanitizer/allocator_interface.h> + +int num_threads; +int total_num_alloc; +const int kMaxNumThreads = 500; +pthread_t tid[kMaxNumThreads]; + +pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +bool go = false; + +void *thread_fun(void *arg) { + pthread_mutex_lock(&mutex); + while (!go) pthread_cond_wait(&cond, &mutex); + pthread_mutex_unlock(&mutex); + for (int i = 0; i < total_num_alloc / num_threads; i++) { + void *p = malloc(10); + __asm__ __volatile__("" : : "r"(p) : "memory"); + free(p); + } + return 0; +} + +int main(int argc, char** argv) { + assert(argc == 3); + num_threads = atoi(argv[1]); + assert(num_threads > 0); + assert(num_threads <= kMaxNumThreads); + total_num_alloc = atoi(argv[2]); + assert(total_num_alloc > 0); + + printf("%d threads, %d allocations in each\n", num_threads, + total_num_alloc / num_threads); + fprintf(stderr, "Heap size before: %zd\n", __sanitizer_get_heap_size()); + fprintf(stderr, "Allocated bytes before: %zd\n", + __sanitizer_get_current_allocated_bytes()); + + for (int i = 0; i < num_threads; i++) + pthread_create(&tid[i], 0, thread_fun, 0); + pthread_mutex_lock(&mutex); + go = true; + pthread_cond_broadcast(&cond); + pthread_mutex_unlock(&mutex); + for (int i = 0; i < num_threads; i++) + pthread_join(tid[i], 0); + + fprintf(stderr, "Heap size after: %zd\n", __sanitizer_get_heap_size()); + fprintf(stderr, "Allocated bytes after: %zd\n", + __sanitizer_get_current_allocated_bytes()); + + return 0; +} |