ncurses 5.6 - patch 20080223
authorThomas E. Dickey <dickey@invisible-island.net>
Sun, 24 Feb 2008 01:25:21 +0000 (01:25 +0000)
committerThomas E. Dickey <dickey@invisible-island.net>
Sun, 24 Feb 2008 01:25:21 +0000 (01:25 +0000)
+ fix a size-difference in _nc_globals which caused hanging of mutex
  lock/unlock when termlib was built separately.
+ avoid using nanosleep() in threaded configuration since that often
  is implemented to suspend the entire process.

NEWS
dist.mk
man/terminfo.tail
ncurses/base/lib_newwin.c
ncurses/curses.priv.h
ncurses/tinfo/lib_data.c
test/demo_menus.c
test/hashtest.c
test/ncurses.c
test/test.priv.h
test/worm.c

diff --git a/NEWS b/NEWS
index d71eaf8a36c074558d8611ab4a8f54137d10db62..5634dbc392d4f409f2064fde6ad05c82efac8190 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -25,7 +25,7 @@
 -- sale, use or other dealings in this Software without prior written        --
 -- authorization.                                                            --
 -------------------------------------------------------------------------------
 -- sale, use or other dealings in this Software without prior written        --
 -- authorization.                                                            --
 -------------------------------------------------------------------------------
--- $Id: NEWS,v 1.1206 2008/02/09 23:49:39 tom Exp $
+-- $Id: NEWS,v 1.1208 2008/02/23 21:26:58 tom Exp $
 -------------------------------------------------------------------------------
 
 This is a log of changes that ncurses has gone through since Zeyd started
 -------------------------------------------------------------------------------
 
 This is a log of changes that ncurses has gone through since Zeyd started
@@ -45,6 +45,14 @@ See the AUTHORS file for the corresponding full names.
 Changes through 1.9.9e did not credit all contributions;
 it is not possible to add this information.
 
 Changes through 1.9.9e did not credit all contributions;
 it is not possible to add this information.
 
+20080223
+       + fix a size-difference in _nc_globals which caused hanging of mutex
+         lock/unlock when termlib was built separately.
+
+20080216
+       + avoid using nanosleep() in threaded configuration since that often
+         is implemented to suspend the entire process.
+
 20080209
        + update test programs to build/work with various UNIX curses for
          comparisons.  This was to reinvestigate statement in X/Open curses
 20080209
        + update test programs to build/work with various UNIX curses for
          comparisons.  This was to reinvestigate statement in X/Open curses
diff --git a/dist.mk b/dist.mk
index 0141b05ee9f2c477b0a8aa29f545b8e51064431c..4bc5ab059f73f909457456f5c5a8f208075f3442 100644 (file)
--- a/dist.mk
+++ b/dist.mk
@@ -25,7 +25,7 @@
 # use or other dealings in this Software without prior written               #
 # authorization.                                                             #
 ##############################################################################
 # use or other dealings in this Software without prior written               #
 # authorization.                                                             #
 ##############################################################################
-# $Id: dist.mk,v 1.629 2008/02/09 15:32:57 tom Exp $
+# $Id: dist.mk,v 1.631 2008/02/23 14:51:29 tom Exp $
 # Makefile for creating ncurses distributions.
 #
 # This only needs to be used directly as a makefile by developers, but
 # Makefile for creating ncurses distributions.
 #
 # This only needs to be used directly as a makefile by developers, but
@@ -37,7 +37,7 @@ SHELL = /bin/sh
 # These define the major/minor/patch versions of ncurses.
 NCURSES_MAJOR = 5
 NCURSES_MINOR = 6
 # These define the major/minor/patch versions of ncurses.
 NCURSES_MAJOR = 5
 NCURSES_MINOR = 6
-NCURSES_PATCH = 20080209
+NCURSES_PATCH = 20080223
 
 # We don't append the patch to the version, since this only applies to releases
 VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
 
 # We don't append the patch to the version, since this only applies to releases
 VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
index 60d0b70d170ab2f4a02a61be27eaf46f2b1c8fb0..d06d3a963a63105363eaf1f1bd62cefff7e1aa4a 100644 (file)
@@ -1,4 +1,4 @@
-.\" $Id: terminfo.tail,v 1.48 2007/06/02 20:30:40 tom Exp $
+.\" $Id: terminfo.tail,v 1.49 2008/02/16 20:57:43 tom Exp $
 .\" Beginning of terminfo.tail file
 .\" This file is part of ncurses.
 .\" See "terminfo.head" for copyright.
 .\" Beginning of terminfo.tail file
 .\" This file is part of ncurses.
 .\" See "terminfo.head" for copyright.
@@ -325,7 +325,9 @@ The \fB%\fR encodings have the following meanings:
 outputs `%'
 .TP
 %\fI[[\fP:\fI]flags][width[.precision]][\fPdoxXs\fI]\fP
 outputs `%'
 .TP
 %\fI[[\fP:\fI]flags][width[.precision]][\fPdoxXs\fI]\fP
-as in \fBprintf\fP, flags are [-+#] and space
+as in \fBprintf\fP, flags are [-+#] and space.
+Use a `:' to allow the next character to be a `-' flag,
+avoiding interpreting "%-" as an operator.
 .TP
 %c
 print pop() like %c in \fBprintf\fP
 .TP
 %c
 print pop() like %c in \fBprintf\fP
index 21ba95f34ed6e1a0d7bec77b13ef643916d2115d..835bb0bccae1e58b570dde770523352d5fecbfd5 100644 (file)
@@ -40,8 +40,9 @@
 */
 
 #include <curses.priv.h>
 */
 
 #include <curses.priv.h>
+#include <stddef.h>
 
 
-MODULE_ID("$Id: lib_newwin.c,v 1.44 2008/01/13 00:28:13 tom Exp $")
+MODULE_ID("$Id: lib_newwin.c,v 1.45 2008/02/23 20:57:58 tom Exp $")
 
 static WINDOW *
 remove_window_from_screen(WINDOW *win)
 
 static WINDOW *
 remove_window_from_screen(WINDOW *win)
@@ -230,14 +231,7 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags)
     if ((wp = typeCalloc(WINDOWLIST, 1)) == 0)
        returnWin(0);
 
     if ((wp = typeCalloc(WINDOWLIST, 1)) == 0)
        returnWin(0);
 
-#ifdef USE_PTHREADS
-    {
-       pthread_mutexattr_t recattr;
-       memset(&recattr, 0, sizeof(recattr));
-       pthread_mutexattr_settype(&recattr, PTHREAD_MUTEX_NORMAL);
-       pthread_mutex_init(&(wp->mutex_use_window), &recattr);
-    }
-#endif
+    _nc_mutex_init(&(wp->mutex_use_window));
 
     win = &(wp->win);
 
 
     win = &(wp->win);
 
index 1e748eeca7a610da4a965fc82ac4d81a4f96d728..ddf15a8a4eb4bb48bc6cb58f94bad03041050d13 100644 (file)
@@ -34,7 +34,7 @@
 
 
 /*
 
 
 /*
- * $Id: curses.priv.h,v 1.357 2008/01/13 00:33:10 tom Exp $
+ * $Id: curses.priv.h,v 1.359 2008/02/23 21:19:56 tom Exp $
  *
  *     curses.priv.h
  *
  *
  *     curses.priv.h
  *
@@ -312,8 +312,10 @@ color_t;
 #define TR_GLOBAL_MUTEX(name) TR_MUTEX(_nc_globals.mutex_##name)
 
 #ifdef USE_PTHREADS
 #define TR_GLOBAL_MUTEX(name) TR_MUTEX(_nc_globals.mutex_##name)
 
 #ifdef USE_PTHREADS
+
 #if USE_REENTRANT
 #include <pthread.h>
 #if USE_REENTRANT
 #include <pthread.h>
+extern NCURSES_EXPORT(void) _nc_mutex_init(pthread_mutex_t *);
 extern NCURSES_EXPORT(int) _nc_mutex_lock(pthread_mutex_t *);
 extern NCURSES_EXPORT(int) _nc_mutex_trylock(pthread_mutex_t *);
 extern NCURSES_EXPORT(int) _nc_mutex_unlock(pthread_mutex_t *);
 extern NCURSES_EXPORT(int) _nc_mutex_lock(pthread_mutex_t *);
 extern NCURSES_EXPORT(int) _nc_mutex_trylock(pthread_mutex_t *);
 extern NCURSES_EXPORT(int) _nc_mutex_unlock(pthread_mutex_t *);
@@ -327,7 +329,16 @@ extern NCURSES_EXPORT(void) _nc_unlock_window(WINDOW *);
 #else
 #error POSIX threads requires --enable-reentrant option
 #endif
 #else
 #error POSIX threads requires --enable-reentrant option
 #endif
-#else
+
+#if HAVE_NANOSLEEP
+#undef HAVE_NANOSLEEP
+#define HAVE_NANOSLEEP 0       /* nanosleep suspends all threads */
+#endif
+
+#else /* !USE_PTHREADS */
+
+#define _nc_mutex_init(obj)    /* nothing */
+
 #define _nc_lock_global(name)  /* nothing */
 #define _nc_try_global(name)    0
 #define _nc_unlock_global(name)        /* nothing */
 #define _nc_lock_global(name)  /* nothing */
 #define _nc_try_global(name)    0
 #define _nc_unlock_global(name)        /* nothing */
@@ -335,7 +346,7 @@ extern NCURSES_EXPORT(void) _nc_unlock_window(WINDOW *);
 #define _nc_lock_window(name)  (void) TRUE
 #define _nc_unlock_window(name)        /* nothing */
 
 #define _nc_lock_window(name)  (void) TRUE
 #define _nc_unlock_window(name)        /* nothing */
 
-#endif
+#endif /* USE_PTHREADS */
 
 #define _nc_lock_screen(name)  /* nothing */
 #define _nc_unlock_screen(name)        /* nothing */
 
 #define _nc_lock_screen(name)  /* nothing */
 #define _nc_unlock_screen(name)        /* nothing */
@@ -583,11 +594,9 @@ typedef struct {
        unsigned char   *tracetry_buf;
        size_t          tracetry_used;
 
        unsigned char   *tracetry_buf;
        size_t          tracetry_used;
 
-#ifndef USE_TERMLIB
        char            traceatr_color_buf[2][80];
        int             traceatr_color_sel;
        int             traceatr_color_last;
        char            traceatr_color_buf[2][80];
        int             traceatr_color_sel;
        int             traceatr_color_last;
-#endif /* USE_TERMLIB */
 
 #endif /* TRACE */
 
 
 #endif /* TRACE */
 
index 21b854b92b6f840cc56df61c9d7df4cacca7ad68..e3affe40ee86c7709998a910e3655182efab170c 100644 (file)
@@ -41,7 +41,7 @@
 
 #include <curses.priv.h>
 
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: lib_data.c,v 1.39 2008/01/13 01:21:59 tom Exp $")
+MODULE_ID("$Id: lib_data.c,v 1.40 2008/02/23 21:23:44 tom Exp $")
 
 /*
  * OS/2's native linker complains if we don't initialize public data when
 
 /*
  * OS/2's native linker complains if we don't initialize public data when
@@ -109,7 +109,7 @@ NCURSES_EXPORT_VAR(SCREEN *) SP = NULL; /* Some linkers require initialized data
 #define CHARS_0s { '\0' }
 
 #define TGETENT_0 { 0L, FALSE, NULL, NULL, NULL }
 #define CHARS_0s { '\0' }
 
 #define TGETENT_0 { 0L, FALSE, NULL, NULL, NULL }
-#define TGETENT_0s { TGETENT_0, TGETENT_0, TGETENT_0, TGETENT_0 } 
+#define TGETENT_0s { TGETENT_0, TGETENT_0, TGETENT_0, TGETENT_0 }
 
 NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = {
     0,                         /* have_sigwinch */
 
 NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = {
     0,                         /* have_sigwinch */
@@ -171,11 +171,9 @@ NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = {
     NULL,                      /* tracetry_buf */
     0,                         /* tracetry_used */
 
     NULL,                      /* tracetry_buf */
     0,                         /* tracetry_used */
 
-#ifndef USE_TERMLIB
     { CHARS_0s, CHARS_0s },    /* traceatr_color_buf */
     0,                         /* traceatr_color_sel */
     -1,                                /* traceatr_color_last */
     { CHARS_0s, CHARS_0s },    /* traceatr_color_buf */
     0,                         /* traceatr_color_sel */
     -1,                                /* traceatr_color_last */
-#endif /* USE_TERMLIB */
 
 #endif /* TRACE */
 #ifdef USE_PTHREADS
 
 #endif /* TRACE */
 #ifdef USE_PTHREADS
@@ -236,20 +234,30 @@ NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen = {
 
 /******************************************************************************/
 #ifdef USE_PTHREADS
 
 /******************************************************************************/
 #ifdef USE_PTHREADS
+NCURSES_EXPORT(void)
+_nc_mutex_init(pthread_mutex_t * obj)
+{
+    pthread_mutexattr_t recattr;
+
+    memset(&recattr, 0, sizeof(recattr));
+    pthread_mutexattr_settype(&recattr, PTHREAD_MUTEX_NORMAL);
+    pthread_mutex_init(obj, &recattr);
+}
+
 NCURSES_EXPORT(int)
 NCURSES_EXPORT(int)
-_nc_mutex_lock(pthread_mutex_t *obj)
+_nc_mutex_lock(pthread_mutex_t * obj)
 {
     return pthread_mutex_lock(obj);
 }
 
 NCURSES_EXPORT(int)
 {
     return pthread_mutex_lock(obj);
 }
 
 NCURSES_EXPORT(int)
-_nc_mutex_trylock(pthread_mutex_t *obj)
+_nc_mutex_trylock(pthread_mutex_t * obj)
 {
     return pthread_mutex_trylock(obj);
 }
 
 NCURSES_EXPORT(int)
 {
     return pthread_mutex_trylock(obj);
 }
 
 NCURSES_EXPORT(int)
-_nc_mutex_unlock(pthread_mutex_t *obj)
+_nc_mutex_unlock(pthread_mutex_t * obj)
 {
     return pthread_mutex_unlock(obj);
 }
 {
     return pthread_mutex_unlock(obj);
 }
index 84322eb4a8da1053efa1a149e58a1ad6b07b56b0..d572b2d17c99b43ab2786ca725ccbc066926189a 100644 (file)
@@ -26,7 +26,7 @@
  * authorization.                                                           *
  ****************************************************************************/
 /*
  * authorization.                                                           *
  ****************************************************************************/
 /*
- * $Id: demo_menus.c,v 1.22 2008/02/09 18:09:26 tom Exp $
+ * $Id: demo_menus.c,v 1.23 2008/02/23 23:06:49 tom Exp $
  *
  * Demonstrate a variety of functions from the menu library.
  * Thomas Dickey - 2005/4/9
  *
  * Demonstrate a variety of functions from the menu library.
  * Thomas Dickey - 2005/4/9
@@ -130,14 +130,14 @@ wGetchar(WINDOW *win)
     while ((c = wgetch(win)) == CTRL('T')) {
        if (_nc_tracing) {
            save_trace = _nc_tracing;
     while ((c = wgetch(win)) == CTRL('T')) {
        if (_nc_tracing) {
            save_trace = _nc_tracing;
-           _tracef("TOGGLE-TRACING OFF");
+           Trace(("TOGGLE-TRACING OFF"));
            _nc_tracing = 0;
        } else {
            _nc_tracing = save_trace;
        }
        trace(_nc_tracing);
        if (_nc_tracing)
            _nc_tracing = 0;
        } else {
            _nc_tracing = save_trace;
        }
        trace(_nc_tracing);
        if (_nc_tracing)
-           _tracef("TOGGLE-TRACING ON");
+           Trace(("TOGGLE-TRACING ON"));
     }
 #else
     c = wgetch(win);
     }
 #else
     c = wgetch(win);
@@ -270,7 +270,7 @@ menu_destroy(MENU * m)
 #if 0
        if (count > 0) {
            while (*ip) {
 #if 0
        if (count > 0) {
            while (*ip) {
-               _tracef("freeing item %d:%d", ip - menu_items(m), count);
+               Trace(("freeing item %d:%d", ip - menu_items(m), count));
                free_item(*ip++);
            }
        }
                free_item(*ip++);
            }
        }
@@ -524,7 +524,7 @@ perform_trace_menu(int cmd)
                    newtrace |= t_tbl[item_index(*ip)].mask;
            }
            trace(newtrace);
                    newtrace |= t_tbl[item_index(*ip)].mask;
            }
            trace(newtrace);
-           _tracef("trace level interactively set to %s", tracetrace(_nc_tracing));
+           Trace(("trace level interactively set to %s", tracetrace(_nc_tracing)));
 
            (void) mvprintw(LINES - 2, 0,
                            "Trace level is %s\n", tracetrace(_nc_tracing));
 
            (void) mvprintw(LINES - 2, 0,
                            "Trace level is %s\n", tracetrace(_nc_tracing));
index 85248c81665aad92f70c71e61d7ad624c82a547c..737731ea61298dfae2f687259bcd2d74f00dc891 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
 /****************************************************************************
- * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
  *
  * Generate timing statistics for vertical-motion optimization.
  *
  *
  * Generate timing statistics for vertical-motion optimization.
  *
- * $Id: hashtest.c,v 1.27 2007/07/21 17:45:09 tom Exp $
+ * $Id: hashtest.c,v 1.28 2008/02/23 23:02:41 tom Exp $
  */
 
  */
 
-#ifdef TRACE
-#define Trace(p) _tracef p
-#define USE_TRACE 1
-#else
-#define Trace(p)               /* nothing */
-#define USE_TRACE 0
-#endif
-
 #include <test.priv.h>
 
 #define LO_CHAR ' '
 #include <test.priv.h>
 
 #define LO_CHAR ' '
index aa1c970305b911434eeb8e78213e4b842a2e7606..0e724a65df0bb51ad52ce834710eb1c13d952ee7 100644 (file)
@@ -40,7 +40,7 @@ AUTHOR
    Author: Eric S. Raymond <esr@snark.thyrsus.com> 1993
            Thomas E. Dickey (beginning revision 1.27 in 1996).
 
    Author: Eric S. Raymond <esr@snark.thyrsus.com> 1993
            Thomas E. Dickey (beginning revision 1.27 in 1996).
 
-$Id: ncurses.c,v 1.301 2008/02/09 17:19:55 tom Exp $
+$Id: ncurses.c,v 1.302 2008/02/23 23:07:28 tom Exp $
 
 ***************************************************************************/
 
 
 ***************************************************************************/
 
@@ -183,14 +183,14 @@ wGetchar(WINDOW *win)
     while ((c = wgetch(win)) == CTRL('T')) {
        if (_nc_tracing) {
            save_trace = _nc_tracing;
     while ((c = wgetch(win)) == CTRL('T')) {
        if (_nc_tracing) {
            save_trace = _nc_tracing;
-           _tracef("TOGGLE-TRACING OFF");
+           Trace(("TOGGLE-TRACING OFF"));
            _nc_tracing = 0;
        } else {
            _nc_tracing = save_trace;
        }
        trace(_nc_tracing);
        if (_nc_tracing)
            _nc_tracing = 0;
        } else {
            _nc_tracing = save_trace;
        }
        trace(_nc_tracing);
        if (_nc_tracing)
-           _tracef("TOGGLE-TRACING ON");
+           Trace(("TOGGLE-TRACING ON"));
     }
 #else
     c = wgetch(win);
     }
 #else
     c = wgetch(win);
@@ -276,14 +276,14 @@ wGet_wchar(WINDOW *win, wint_t *result)
     while ((c = wget_wch(win, result)) == CTRL('T')) {
        if (_nc_tracing) {
            save_trace = _nc_tracing;
     while ((c = wget_wch(win, result)) == CTRL('T')) {
        if (_nc_tracing) {
            save_trace = _nc_tracing;
-           _tracef("TOGGLE-TRACING OFF");
+           Trace(("TOGGLE-TRACING OFF"));
            _nc_tracing = 0;
        } else {
            _nc_tracing = save_trace;
        }
        trace(_nc_tracing);
        if (_nc_tracing)
            _nc_tracing = 0;
        } else {
            _nc_tracing = save_trace;
        }
        trace(_nc_tracing);
        if (_nc_tracing)
-           _tracef("TOGGLE-TRACING ON");
+           Trace(("TOGGLE-TRACING ON"));
     }
 #else
     c = wget_wch(win, result);
     }
 #else
     c = wget_wch(win, result);
@@ -5079,7 +5079,7 @@ trace_set(void)
        if (item_value(*ip))
            newtrace |= t_tbl[item_index(*ip)].mask;
     trace(newtrace);
        if (item_value(*ip))
            newtrace |= t_tbl[item_index(*ip)].mask;
     trace(newtrace);
-    _tracef("trace level interactively set to %s", tracetrace(_nc_tracing));
+    Trace(("trace level interactively set to %s", tracetrace(_nc_tracing)));
 
     (void) mvprintw(LINES - 2, 0,
                    "Trace level is %s\n", tracetrace(_nc_tracing));
 
     (void) mvprintw(LINES - 2, 0,
                    "Trace level is %s\n", tracetrace(_nc_tracing));
index fb5f203fc0b18bdcd564c1243f133fadef4fdf5f..0eabbcc754779e68714c518d705cb5f470703e5f 100644 (file)
@@ -29,7 +29,7 @@
 /****************************************************************************
  *  Author: Thomas E. Dickey                    1996-on                     *
  ****************************************************************************/
 /****************************************************************************
  *  Author: Thomas E. Dickey                    1996-on                     *
  ****************************************************************************/
-/* $Id: test.priv.h,v 1.73 2008/02/10 00:12:55 tom Exp $ */
+/* $Id: test.priv.h,v 1.74 2008/02/23 23:02:41 tom Exp $ */
 
 #ifndef __TEST_PRIV_H
 #define __TEST_PRIV_H 1
 
 #ifndef __TEST_PRIV_H
 #define __TEST_PRIV_H 1
@@ -547,5 +547,12 @@ use_window(WINDOW *win, int (*func) (WINDOW *, void *), void *data) \
 #define USING_WINDOW(w,func) func(w)
 #endif
 
 #define USING_WINDOW(w,func) func(w)
 #endif
 
+#ifdef TRACE
+#define Trace(p) _tracef p
+#define USE_TRACE 1
+#else
+#define Trace(p)               /* nothing */
+#define USE_TRACE 0
+#endif
 
 #endif /* __TEST_PRIV_H */
 
 #endif /* __TEST_PRIV_H */
index 23b0ef4ae85c70792dae3b0ee12d7298942bbba5..d78f9b9621ed9c184140ad17cff8a9f7bcfa10ae 100644 (file)
@@ -61,7 +61,7 @@ Options:
   traces will be dumped.  The program stops and waits for one character of
   input at the beginning and end of the interval.
 
   traces will be dumped.  The program stops and waits for one character of
   input at the beginning and end of the interval.
 
-  $Id: worm.c,v 1.55 2008/01/26 22:07:57 tom Exp $
+  $Id: worm.c,v 1.56 2008/02/23 23:08:57 tom Exp $
 */
 
 #include <test.priv.h>
 */
 
 #include <test.priv.h>
@@ -321,12 +321,14 @@ static void *
 start_worm(void *arg)
 {
     unsigned long compare = 0;
 start_worm(void *arg)
 {
     unsigned long compare = 0;
+    Trace(("start_worm"));
     while (!quit_worm()) {
        while (compare < sequence) {
            ++compare;
            use_window(stdscr, draw_worm, arg);
        }
     }
     while (!quit_worm()) {
        while (compare < sequence) {
            ++compare;
            use_window(stdscr, draw_worm, arg);
        }
     }
+    Trace(("...start_worm (done)"));
     return NULL;
 }
 #endif
     return NULL;
 }
 #endif
@@ -576,6 +578,7 @@ main(int argc, char *argv[])
        USING_WINDOW(stdscr, wrefresh);
     }
 
        USING_WINDOW(stdscr, wrefresh);
     }
 
+    Trace(("Cleanup"));
     cleanup();
 #ifdef NO_LEAKS
     for (y = 0; y < LINES; y++) {
     cleanup();
 #ifdef NO_LEAKS
     for (y = 0; y < LINES; y++) {
@@ -591,6 +594,7 @@ main(int argc, char *argv[])
     /*
      * Do this just in case one of the threads did not really exit.
      */
     /*
      * Do this just in case one of the threads did not really exit.
      */
+    Trace(("join all threads"));
     for (n = 0; n < number; n++) {
        pthread_join(worm[n].thread, NULL);
     }
     for (n = 0; n < number; n++) {
        pthread_join(worm[n].thread, NULL);
     }