1/* 2 * Copyright (C) 2001 Jason Evans <jasone@freebsd.org>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice(s), this list of conditions and the following disclaimer as 10 * the first lines of this file unmodified other than the possible 11 * addition of one or more copyright notices. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice(s), this list of conditions and the following disclaimer in 14 * the documentation and/or other materials provided with the 15 * distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE 21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 27 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * $FreeBSD$ 30 * 31 * Test for leaked joined threads. 32 */ 33 34#include <stdio.h> 35#include <stdlib.h> 36#include <unistd.h> 37 38#include <errno.h> 39#include <string.h> 40#include <pthread.h> 41 42#define NITERATIONS 16384 43#define MAXGROWTH 16384 44 45void * 46thread_entry(void *a_arg) 47{ 48 return NULL; 49} 50 51int 52main(void) 53{ 54 pthread_t thread; 55 int i, error; 56 char *brk, *nbrk; 57 unsigned growth; 58 59 fprintf(stderr, "Test begin\n"); 60 61 /* Get an initial brk value. */ 62 brk = sbrk(0); 63 64 /* Create threads and join them, one at a time. */ 65 for (i = 0; i < NITERATIONS; i++) { 66 if ((error = pthread_create(&thread, NULL, thread_entry, NULL)) 67 != 0) { 68 fprintf(stderr, "Error in pthread_create(): %s\n", 69 strerror(error)); 70 exit(1); 71 } 72 if ((error = pthread_join(thread, NULL)) != 0) { 73 fprintf(stderr, "Error in pthread_join(): %s\n", 74 strerror(error)); 75 exit(1); 76 } 77 } 78 79 /* Get a final brk value. */ 80 nbrk = sbrk(0); 81 82 /* 83 * Check that the amount of heap space allocated is below an acceptable 84 * threshold. We could just compare brk and nbrk, but the test could 85 * conceivably break if the internals of the threads library changes. 86 */ 87 if (nbrk > brk) { 88 /* Heap grows up. */ 89 growth = nbrk - brk; 90 } else if (nbrk <= brk) { 91 /* Heap grows down, or no growth. */ 92 growth = brk - nbrk; 93 } 94 95 if (growth > MAXGROWTH) { 96 fprintf(stderr, "Heap growth exceeded maximum (%u > %u)\n", 97 growth, MAXGROWTH); 98 } 99#if (0) 100 else { 101 fprintf(stderr, "Heap growth acceptable (%u <= %u)\n", 102 growth, MAXGROWTH); 103 } 104#endif 105 106 fprintf(stderr, "Test end\n"); 107 return 0; 108} 109