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