forked from pool/ncurses
297 lines
9.1 KiB
Plaintext
297 lines
9.1 KiB
Plaintext
--- configure
|
|
+++ configure 2008-08-15 17:26:58.354794367 +0200
|
|
@@ -9310,6 +9310,7 @@ if test "$with_pthread" = "yes" ; then
|
|
EOF
|
|
|
|
enable_reentrant=yes
|
|
+ PTHREAD=-lpthread
|
|
fi
|
|
|
|
# Reentrant code has to be opaque; there's little advantage to making ncurses
|
|
@@ -9333,7 +9334,8 @@ if test "$with_reentrant" = yes ; then
|
|
cf_cv_enable_opaque="NCURSES_INTERNALS"
|
|
NCURSES_OPAQUE=1
|
|
NCURSES_SIZE_T=int
|
|
- LIB_SUFFIX="t${LIB_SUFFIX}"
|
|
+# remove pthread library from $LIBS
|
|
+LIBS=`echo "$LIBS" | sed -e 's/-lpthread[ ]//g' -e 's/-lpthread$//'`
|
|
cat >>confdefs.h <<\EOF
|
|
#define USE_REENTRANT 1
|
|
EOF
|
|
@@ -16785,6 +16787,7 @@ s,@NCURSES_EXT_COLORS@,$NCURSES_EXT_COLO
|
|
s,@NCURSES_MOUSE_VERSION@,$NCURSES_MOUSE_VERSION,;t t
|
|
s,@NCURSES_SBOOL@,$NCURSES_SBOOL,;t t
|
|
s,@NCURSES_XNAMES@,$NCURSES_XNAMES,;t t
|
|
+s,@PTHREAD@,$PTHREAD,;t t
|
|
s,@cf_cv_enable_reentrant@,$cf_cv_enable_reentrant,;t t
|
|
s,@cf_cv_enable_opaque@,$cf_cv_enable_opaque,;t t
|
|
s,@NCURSES_OPAQUE@,$NCURSES_OPAQUE,;t t
|
|
--- configure.in
|
|
+++ configure.in 2008-08-15 17:24:08.626825950 +0200
|
|
@@ -972,9 +972,11 @@ test "$with_colorfgbg" = yes && AC_DEFIN
|
|
# This is still experimental (20080329), but should ultimately be moved to
|
|
# the script-block --with-normal, etc.
|
|
CF_WITH_PTHREAD
|
|
+AC_SUBST(PTHREAD)
|
|
if test "$with_pthread" = "yes" ; then
|
|
AC_DEFINE(USE_PTHREADS)
|
|
enable_reentrant=yes
|
|
+ PTHREAD=-lpthread
|
|
fi
|
|
|
|
# Reentrant code has to be opaque; there's little advantage to making ncurses
|
|
@@ -992,7 +994,7 @@ if test "$with_reentrant" = yes ; then
|
|
cf_cv_enable_opaque="NCURSES_INTERNALS"
|
|
NCURSES_OPAQUE=1
|
|
NCURSES_SIZE_T=int
|
|
- LIB_SUFFIX="t${LIB_SUFFIX}"
|
|
+ CF_REMOVE_LIB(LIBS,$LIBS,pthread)
|
|
AC_DEFINE(USE_REENTRANT)
|
|
CF_NCURSES_ABI_6
|
|
else
|
|
--- ncurses/curses.priv.h
|
|
+++ ncurses/curses.priv.h 2008-08-15 14:54:39.906243654 +0200
|
|
@@ -330,6 +330,7 @@ NCURSES_EXPORT(int *) _nc_ptr_Cols (void
|
|
|
|
#if USE_REENTRANT
|
|
#include <pthread.h>
|
|
+extern NCURSES_EXPORT(void) _nc_init_pthreads(void);
|
|
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 *);
|
|
@@ -337,11 +338,43 @@ extern NCURSES_EXPORT(int) _nc_mutex_unl
|
|
#define _nc_lock_global(name) _nc_mutex_lock(&_nc_globals.mutex_##name)
|
|
#define _nc_try_global(name) _nc_mutex_trylock(&_nc_globals.mutex_##name)
|
|
#define _nc_unlock_global(name) _nc_mutex_unlock(&_nc_globals.mutex_##name)
|
|
+#define FORCE_PTHREADS 0
|
|
|
|
#else
|
|
#error POSIX threads requires --enable-reentrant option
|
|
#endif
|
|
|
|
+#if defined(__GNUC__) && defined(__linux__)
|
|
+# if defined __USE_ISOC99
|
|
+# define _cat_pragma(exp) _Pragma(#exp)
|
|
+# define _weak_pragma(exp) _cat_pragma(weak name)
|
|
+# else
|
|
+# define _weak_pragma(exp)
|
|
+# endif
|
|
+# define _declare(name) __extension__ extern __typeof__(name) name
|
|
+# define weak_symbol(name) _weak_pragma(name) _declare(name) __attribute__((weak))
|
|
+# ifdef USE_PTHREADS
|
|
+# undef FORCE_PTHREADS
|
|
+# define FORCE_PTHREADS 1
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+#ifdef USE_PTHREADS
|
|
+# if FORCE_PTHREADS
|
|
+weak_symbol(pthread_sigmask);
|
|
+weak_symbol(pthread_self);
|
|
+weak_symbol(pthread_equal);
|
|
+weak_symbol(pthread_mutex_init);
|
|
+weak_symbol(pthread_mutex_lock);
|
|
+weak_symbol(pthread_mutex_unlock);
|
|
+weak_symbol(pthread_mutex_trylock);
|
|
+weak_symbol(pthread_mutexattr_settype);
|
|
+extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *);
|
|
+# undef sigprocmask
|
|
+# define sigprocmask _nc_sigprocmask
|
|
+# endif
|
|
+#endif
|
|
+
|
|
#if HAVE_NANOSLEEP
|
|
#undef HAVE_NANOSLEEP
|
|
#define HAVE_NANOSLEEP 0 /* nanosleep suspends all threads */
|
|
@@ -349,6 +382,7 @@ extern NCURSES_EXPORT(int) _nc_mutex_unl
|
|
|
|
#else /* !USE_PTHREADS */
|
|
|
|
+#define _nc_init_pthreads() /* nothing */
|
|
#define _nc_mutex_init(obj) /* nothing */
|
|
|
|
#define _nc_lock_global(name) /* nothing */
|
|
@@ -616,10 +650,12 @@ typedef struct {
|
|
#endif /* TRACE */
|
|
|
|
#ifdef USE_PTHREADS
|
|
- pthread_mutex_t mutex_curses;
|
|
- pthread_mutex_t mutex_tst_tracef;
|
|
- pthread_mutex_t mutex_tracef;
|
|
- int nested_tracef;
|
|
+ pthread_mutex_t mutex_curses;
|
|
+ pthread_mutex_t mutex_tst_tracef;
|
|
+ pthread_mutex_t mutex_tracef;
|
|
+ int nested_tracef;
|
|
+ int use_pthreads;
|
|
+#define _nc_use_pthreads _nc_globals.use_pthreads
|
|
#endif
|
|
} NCURSES_GLOBALS;
|
|
|
|
--- ncurses/base/lib_getch.c
|
|
+++ ncurses/base/lib_getch.c 2008-08-15 14:59:26.569224183 +0200
|
|
@@ -260,7 +260,7 @@ recur_wrefresh(WINDOW *win)
|
|
{
|
|
#ifdef USE_PTHREADS
|
|
SCREEN *sp = _nc_screen_of(win);
|
|
- if (sp != SP) {
|
|
+ if (_nc_use_pthreads && sp != SP) {
|
|
SCREEN *save_SP;
|
|
|
|
/* temporarily switch to the window's screen to check/refresh */
|
|
@@ -286,7 +286,7 @@ recur_wgetnstr(WINDOW *win, char *buf)
|
|
|
|
if (sp != 0) {
|
|
#ifdef USE_PTHREADS
|
|
- if (sp != SP) {
|
|
+ if (_nc_use_pthreads && sp != SP) {
|
|
SCREEN *save_SP;
|
|
|
|
/* temporarily switch to the window's screen to get cooked input */
|
|
--- ncurses/base/lib_initscr.c
|
|
+++ ncurses/base/lib_initscr.c 2008-08-15 14:37:44.598653367 +0200
|
|
@@ -57,7 +57,9 @@ initscr(void)
|
|
START_TRACE();
|
|
T((T_CALLED("initscr()")));
|
|
|
|
+ _nc_init_pthreads();
|
|
_nc_lock_global(curses);
|
|
+
|
|
/* Portable applications must not call initscr() more than once */
|
|
if (!_nc_globals.init_screen) {
|
|
_nc_globals.init_screen = TRUE;
|
|
--- ncurses/base/lib_newterm.c
|
|
+++ ncurses/base/lib_newterm.c 2008-08-15 14:37:33.293589963 +0200
|
|
@@ -130,6 +130,7 @@ newterm(NCURSES_CONST char *name, FILE *
|
|
START_TRACE();
|
|
T((T_CALLED("newterm(\"%s\",%p,%p)"), name, ofp, ifp));
|
|
|
|
+ _nc_init_pthreads();
|
|
_nc_lock_global(curses);
|
|
|
|
current = SP;
|
|
--- ncurses/tinfo/lib_data.c
|
|
+++ ncurses/tinfo/lib_data.c 2008-08-15 14:42:37.974271725 +0200
|
|
@@ -181,6 +181,7 @@ NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_
|
|
PTHREAD_MUTEX_INITIALIZER, /* mutex_tst_tracef */
|
|
PTHREAD_MUTEX_INITIALIZER, /* mutex_tracef */
|
|
0, /* nested_tracef */
|
|
+ 0, /* use_pthreads */
|
|
#endif
|
|
};
|
|
|
|
@@ -248,6 +249,27 @@ init_global_mutexes(void)
|
|
}
|
|
}
|
|
|
|
+NCURSES_EXPORT(void)
|
|
+_nc_init_pthreads(void)
|
|
+{
|
|
+ if (_nc_use_pthreads)
|
|
+ return;
|
|
+# if FORCE_PTHREADS
|
|
+ if ((pthread_mutex_init) == 0)
|
|
+ return;
|
|
+ if ((pthread_mutex_lock) == 0)
|
|
+ return;
|
|
+ if ((pthread_mutex_unlock) == 0)
|
|
+ return;
|
|
+ if ((pthread_mutex_trylock) == 0)
|
|
+ return;
|
|
+ if ((pthread_mutexattr_settype) == 0)
|
|
+ return;
|
|
+# endif
|
|
+ _nc_use_pthreads = 1;
|
|
+ init_global_mutexes();
|
|
+}
|
|
+
|
|
/*
|
|
* Use recursive mutexes if we have them - they're part of Unix98.
|
|
* For the cases where we do not, _nc_mutex_trylock() is used to avoid a
|
|
@@ -262,6 +284,8 @@ _nc_mutex_init(pthread_mutex_t * obj)
|
|
{
|
|
pthread_mutexattr_t recattr;
|
|
|
|
+ if (_nc_use_pthreads == 0)
|
|
+ return;
|
|
memset(&recattr, 0, sizeof(recattr));
|
|
pthread_mutexattr_settype(&recattr, PTHREAD_MUTEX_RECURSIVE);
|
|
pthread_mutex_init(obj, &recattr);
|
|
@@ -270,21 +294,39 @@ _nc_mutex_init(pthread_mutex_t * obj)
|
|
NCURSES_EXPORT(int)
|
|
_nc_mutex_lock(pthread_mutex_t * obj)
|
|
{
|
|
- init_global_mutexes();
|
|
+ if (_nc_use_pthreads == 0)
|
|
+ return 0;
|
|
return pthread_mutex_lock(obj);
|
|
}
|
|
|
|
NCURSES_EXPORT(int)
|
|
_nc_mutex_trylock(pthread_mutex_t * obj)
|
|
{
|
|
- init_global_mutexes();
|
|
+ if (_nc_use_pthreads == 0)
|
|
+ return 0;
|
|
return pthread_mutex_trylock(obj);
|
|
}
|
|
|
|
NCURSES_EXPORT(int)
|
|
_nc_mutex_unlock(pthread_mutex_t * obj)
|
|
{
|
|
- init_global_mutexes();
|
|
+ if (_nc_use_pthreads == 0)
|
|
+ return 0;
|
|
return pthread_mutex_unlock(obj);
|
|
}
|
|
+
|
|
+#if FORCE_PTHREADS
|
|
+/*
|
|
+ * NB: sigprocmask(2) is global but pthread_sigmask(3p)
|
|
+ * only for the calling thread.
|
|
+ */
|
|
+NCURSES_EXPORT(int)
|
|
+_nc_sigprocmask(int how, const sigset_t *newmask, sigset_t *oldmask)
|
|
+{
|
|
+ if ((pthread_sigmask))
|
|
+ return pthread_sigmask(how, newmask, oldmask);
|
|
+ else
|
|
+ return sigprocmask(how, newmask, oldmask);
|
|
+}
|
|
+#endif
|
|
#endif /* USE_PTHREADS */
|
|
--- ncurses/tinfo/lib_options.c
|
|
+++ ncurses/tinfo/lib_options.c 2008-08-15 15:02:29.662454211 +0200
|
|
@@ -245,7 +245,7 @@ _nc_keypad(SCREEN *sp, bool flag)
|
|
* has wgetch() reading in more than one thread. putp() and below
|
|
* may use SP explicitly.
|
|
*/
|
|
- if (sp != SP) {
|
|
+ if (_nc_use_pthreads && sp != SP) {
|
|
SCREEN *save_sp;
|
|
|
|
/* cannot use use_screen(), since that is not in tinfo library */
|
|
--- ncurses/trace/lib_trace.c
|
|
+++ ncurses/trace/lib_trace.c 2008-08-15 14:26:03.884728534 +0200
|
|
@@ -180,6 +180,9 @@ _nc_va_tracef(const char *fmt, va_list a
|
|
* Rather than add the complication of a per-thread stack, just
|
|
* show the thread-id in each line of the trace.
|
|
*/
|
|
+# if FORCE_PTHREADS
|
|
+ if ((pthread_self))
|
|
+# endif
|
|
fprintf(TraceFP, "%#lx:", (long) pthread_self());
|
|
#endif
|
|
if (before || after) {
|
|
--- test/Makefile.in
|
|
+++ test/Makefile.in 2008-08-15 17:21:56.826424899 +0200
|
|
@@ -95,7 +95,7 @@ LIBS_DEFAULT = $(TEST_ARGS) @LIBS@ $(TES
|
|
LDFLAGS_DEFAULT = $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_DEFAULT)
|
|
|
|
# use these for linking with the (n)curses library
|
|
-LIBS_CURSES = `echo "$(TEST_ARGS) @LIBS@" | sed -e 's/-lform.*-lpanel[^ ]*//'` $(TEST_LIBS) $(MATH_LIB)
|
|
+LIBS_CURSES = `echo "$(TEST_ARGS) @LIBS@" | sed -e 's/-lform.*-lpanel[^ ]*//'` $(TEST_LIBS) $(MATH_LIB) @PTHREAD@
|
|
LDFLAGS_CURSES = $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_CURSES)
|
|
|
|
# use these for linking with the tinfo library if we have it, or curses library if not
|