lib_freeall.c revision 178867
1/****************************************************************************
2 * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc.              *
3 *                                                                          *
4 * Permission is hereby granted, free of charge, to any person obtaining a  *
5 * copy of this software and associated documentation files (the            *
6 * "Software"), to deal in the Software without restriction, including      *
7 * without limitation the rights to use, copy, modify, merge, publish,      *
8 * distribute, distribute with modifications, sublicense, and/or sell       *
9 * copies of the Software, and to permit persons to whom the Software is    *
10 * furnished to do so, subject to the following conditions:                 *
11 *                                                                          *
12 * The above copyright notice and this permission notice shall be included  *
13 * in all copies or substantial portions of the Software.                   *
14 *                                                                          *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
22 *                                                                          *
23 * Except as contained in this notice, the name(s) of the above copyright   *
24 * holders shall not be used in advertising or otherwise to promote the     *
25 * sale, use or other dealings in this Software without prior written       *
26 * authorization.                                                           *
27 ****************************************************************************/
28
29/****************************************************************************
30 *  Author: Thomas E. Dickey                    1996-on                     *
31 ****************************************************************************/
32
33#include <curses.priv.h>
34#include <term_entry.h>
35#include <tic.h>
36
37#if HAVE_NC_FREEALL
38
39#if HAVE_LIBDBMALLOC
40extern int malloc_errfd;	/* FIXME */
41#endif
42
43MODULE_ID("$Id: lib_freeall.c,v 1.46 2008/05/03 14:13:51 tom Exp $")
44
45/*
46 * Free all ncurses data.  This is used for testing only (there's no practical
47 * use for it as an extension).
48 */
49NCURSES_EXPORT(void)
50_nc_freeall(void)
51{
52    WINDOWLIST *p, *q;
53    static va_list empty_va;
54
55    T((T_CALLED("_nc_freeall()")));
56#if NO_LEAKS
57    if (SP != 0) {
58	if (SP->_oldnum_list != 0) {
59	    FreeAndNull(SP->_oldnum_list);
60	}
61    }
62#endif
63    if (SP != 0) {
64	_nc_lock_global(windowlist);
65
66	while (_nc_windows != 0) {
67	    bool deleted = FALSE;
68
69	    /* Delete only windows that're not a parent */
70	    for (each_window(p)) {
71		bool found = FALSE;
72
73		for (each_window(q)) {
74		    if ((p != q)
75			&& (q->win._flags & _SUBWIN)
76			&& (&(p->win) == q->win._parent)) {
77			found = TRUE;
78			break;
79		    }
80		}
81
82		if (!found) {
83		    if (delwin(&(p->win)) != ERR)
84			deleted = TRUE;
85		    break;
86		}
87	    }
88
89	    /*
90	     * Don't continue to loop if the list is trashed.
91	     */
92	    if (!deleted)
93		break;
94	}
95	delscreen(SP);
96	_nc_unlock_global(windowlist);
97    }
98    if (cur_term != 0)
99	del_curterm(cur_term);
100
101#if USE_WIDEC_SUPPORT
102    FreeIfNeeded(_nc_wacs);
103#endif
104    (void) _nc_printf_string(0, empty_va);
105#ifdef TRACE
106    (void) _nc_trace_buf(-1, 0);
107#endif
108
109#if BROKEN_LINKER || USE_REENTRANT
110    FreeIfNeeded(_nc_prescreen.real_acs_map);
111#endif
112
113    _nc_leaks_tinfo();
114
115#if HAVE_LIBDBMALLOC
116    malloc_dump(malloc_errfd);
117#elif HAVE_LIBDMALLOC
118#elif HAVE_LIBMPATROL
119    __mp_summary();
120#elif HAVE_PURIFY
121    purify_all_inuse();
122#endif
123    returnVoid;
124}
125
126NCURSES_EXPORT(void)
127_nc_free_and_exit(int code)
128{
129    char *last_setbuf = (SP != 0) ? SP->_setbuf : 0;
130
131    _nc_freeall();
132#ifdef TRACE
133    trace(0);			/* close trace file, freeing its setbuf */
134    free(_nc_varargs("?", 0));
135#endif
136    fclose(stdout);
137    FreeIfNeeded(last_setbuf);
138    exit(code);
139}
140
141#else
142NCURSES_EXPORT(void)
143_nc_freeall(void)
144{
145}
146#endif
147