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