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