• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Stress test for the --free-is-write command-line option. */
2 
3 #include <pthread.h>
4 #include <assert.h>
5 #include <unistd.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <pthread.h>
9 #include <string.h>
10 
11 #define MALLOC_SIZE 22816
12 #define THREAD_COUNT 10
13 #define MALLOC_COUNT 1000
14 
15 static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
16 // 'mutex' protects 'count'.
17 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
18 static unsigned count;
19 
thread_func(void * arg)20 void* thread_func(void* arg)
21 {
22   unsigned i;
23 
24   for (i = 0; i < MALLOC_COUNT; ++i) {
25     void* ptr;
26 
27     ptr = malloc(MALLOC_SIZE);
28     memset(ptr, 0, MALLOC_SIZE);
29     free(ptr);
30   }
31 
32   pthread_mutex_lock(&mutex);
33   ++count;
34   pthread_cond_signal(&cond);
35   pthread_mutex_unlock(&mutex);
36 
37   return 0;
38 }
39 
main(int argc,char ** argv)40 int main(int argc, char **argv)
41 {
42   pthread_t thread[THREAD_COUNT];
43   int result;
44   int i;
45 
46   for (i = 0; i < THREAD_COUNT; i++) {
47     result = pthread_create(&thread[i], 0, thread_func, 0);
48     assert(result == 0);
49   }
50 
51   pthread_mutex_lock(&mutex);
52   while (count < THREAD_COUNT && pthread_cond_wait(&cond, &mutex) == 0)
53     ;
54   pthread_mutex_unlock(&mutex);
55 
56   for (i = 0; i < THREAD_COUNT; i++)
57     pthread_join(thread[i], 0);
58 
59   fflush(stdout);
60 
61   fprintf(stderr, "Done.\n");
62 
63   return 0;
64 }
65