X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_newwin.c;h=835bb0bccae1e58b570dde770523352d5fecbfd5;hp=3f7275c110303f1f04f796f29c65328b5e6af564;hb=d44d7f381ba0173521cb788ba3adb12e261e5c96;hpb=cc79c103a0ba4c9cef4f875de199be1502727b9b diff --git a/ncurses/base/lib_newwin.c b/ncurses/base/lib_newwin.c index 3f7275c1..835bb0bc 100644 --- a/ncurses/base/lib_newwin.c +++ b/ncurses/base/lib_newwin.c @@ -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 * @@ -40,8 +40,9 @@ */ #include +#include -MODULE_ID("$Id: lib_newwin.c,v 1.41 2007/10/20 20:56:07 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) @@ -85,29 +86,34 @@ _nc_freewin(WINDOW *win) int i; int result = ERR; + T((T_CALLED("_nc_freewin(%p)"), win)); + if (win != 0) { - for (p = _nc_windows, q = 0; p != 0; q = p, p = p->next) { - if (&(p->win) == win) { - remove_window_from_screen(win); - if (q == 0) - _nc_windows = p->next; - else - q->next = p->next; - - if (!(win->_flags & _SUBWIN)) { - for (i = 0; i <= win->_maxy; i++) - FreeIfNeeded(win->_line[i].text); + if (_nc_try_global(windowlist) == 0) { + for (p = _nc_windows, q = 0; p != 0; q = p, p = p->next) { + if (&(p->win) == win) { + remove_window_from_screen(win); + if (q == 0) + _nc_windows = p->next; + else + q->next = p->next; + + if (!(win->_flags & _SUBWIN)) { + for (i = 0; i <= win->_maxy; i++) + FreeIfNeeded(win->_line[i].text); + } + free(win->_line); + free(p); + + result = OK; + T(("...deleted win=%p", win)); + break; } - free(win->_line); - free(p); - - result = OK; - T(("...deleted win=%p", win)); - break; } + _nc_unlock_global(windowlist); } } - return result; + returnCode(result); } NCURSES_EXPORT(WINDOW *) @@ -225,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); -#ifdef USE_PTHREADS - { - pthread_mutexattr_t recattr; - memset(&recattr, 0, sizeof(recattr)); - pthread_mutexattr_settype(&recattr, PTHREAD_MUTEX_RECURSIVE); - pthread_mutex_init(&(wp->mutex_use_window), &recattr); - } -#endif + _nc_mutex_init(&(wp->mutex_use_window)); win = &(wp->win); @@ -241,6 +240,8 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags) returnWin(0); } + _nc_lock_global(windowlist); + win->_curx = 0; win->_cury = 0; win->_maxy = num_lines - 1; @@ -318,5 +319,6 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags) T((T_CREATE("window %p"), win)); + _nc_unlock_global(windowlist); returnWin(win); }