From 9eeffdf14fddcf59618fdd7c8c16e4cc32429b4d Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Wed, 3 Oct 2001 23:55:18 +0000 Subject: [PATCH] GNU threads support. --- configure.in | 29 +++++++++++++++++++++++------ lib/Makefile.am | 4 ++-- server/statserv.c | 27 ++++++++++++++++++++++++++- util/nmem.c | 41 +++++++++++++++++++++++++++++++++-------- 4 files changed, 84 insertions(+), 17 deletions(-) diff --git a/configure.in b/configure.in index 45b4e61..5dca9ce 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ dnl YAZ Toolkit, Index Data 1994-2001 dnl See the file LICENSE for details. -dnl $Id: configure.in,v 1.45 2001-05-16 07:37:39 adam Exp $ +dnl $Id: configure.in,v 1.46 2001-10-03 23:55:18 adam Exp $ AC_INIT(include/yaz/yaz-version.h) AM_INIT_AUTOMAKE(yaz, 1.7) dnl @@ -122,10 +122,28 @@ if test "$ac_cv_header_stdc" = "no"; then AC_MSG_WARN(Your system doesn't seem to support ANSI C) fi dnl -dnl ------ Threads -AC_ARG_ENABLE(threads, [ --disable-threads disable POSIX threads],[enable_threads=$enableval],[enable_threads=yes]) AC_SUBST(LIBTHREAD) -if test "$enable_threads" = "yes"; then +HAVETHREADS=0 +LIBTHREAD="" +dnl +AC_ARG_ENABLE(pth, [ --disable-pth disable GNU threads],[enable_pth=$enableval],[enable_pth=yes]) +AC_SUBST(LIBPTH) +if test "$enable_pth" = "yes"; then + OLIBS=$LIBS + AC_CHECK_LIB(pth,main) + if test "$ac_cv_lib_pth_main" = "yes"; then + AC_CHECK_HEADERS(pth.h) + if test "$ac_cv_header_pth_h" = "yes"; then + LIBTHREAD="-lpth" + HAVETHREADS=1 + fi + fi + LIBS=$OLIBS +fi +dnl +dnl ------ POSIX Threads +AC_ARG_ENABLE(threads, [ --disable-threads disable POSIX threads],[enable_threads=$enableval],[enable_threads=yes]) +if test "$enable_threads" = "yes" -a "$HAVETHREADS" = "0"; then OLIBS=$LIBS AC_CHECK_LIB(pthread,main) AC_MSG_CHECKING(for working POSIX Threads) @@ -138,11 +156,10 @@ if test "$enable_threads" = "yes"; then if test "$thread_ok" = "yes"; then LIBTHREAD=-lpthread AC_MSG_RESULT(yes) + AC_CHECK_HEADERS(pthread.h) HAVETHREADS=1 else - LIBTHREAD="" AC_MSG_RESULT(no) - HAVETHREADS=0 fi LIBS=$OLIBS fi diff --git a/lib/Makefile.am b/lib/Makefile.am index 03bbf9b..226ad61 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -1,4 +1,4 @@ -## $Id: Makefile.am,v 1.12 2001-05-07 12:01:00 adam Exp $ +## $Id: Makefile.am,v 1.13 2001-10-03 23:55:18 adam Exp $ if ISTHR extra=libyazthread.la @@ -23,7 +23,7 @@ $(srcdir)/statserv.c: $(top_srcdir)/server/statserv.c LDFLAGS=-version-info 1:0:0 -INCLUDES =-I$(top_srcdir)/include -I$(top_srcdir)/server -D_REENTRANT=1 -DHAVE_PTHREAD_H=1 +INCLUDES =-I$(top_srcdir)/include -I$(top_srcdir)/server -D_REENTRANT=1 bin_SCRIPTS = yaz-config diff --git a/server/statserv.c b/server/statserv.c index 40c107f..f4ab5c2 100644 --- a/server/statserv.c +++ b/server/statserv.c @@ -7,7 +7,10 @@ * Chas Woodfield, Fretwell Downing Informatics. * * $Log: statserv.c,v $ - * Revision 1.73 2001-06-28 09:27:06 adam + * Revision 1.74 2001-10-03 23:55:18 adam + * GNU threads support. + * + * Revision 1.73 2001/06/28 09:27:06 adam * Number of started sessions logged. * * Revision 1.72 2001/03/25 21:55:13 adam @@ -259,9 +262,15 @@ #include #include "service.h" #else + +#ifdef _REENTRANT #if HAVE_PTHREAD_H #include +#elif HAVE_PTH_H +#include +#endif #endif + #include #include #endif @@ -706,6 +715,7 @@ static void listener(IOCHAN h, int event) iochan_setflags(h, EVENT_INPUT | EVENT_EXCEPT); /* reset listener */ ++no_sessions; } +#ifdef _REENTRANT #if HAVE_PTHREAD_H if (control_block.threads) { @@ -715,6 +725,21 @@ static void listener(IOCHAN h, int event) } else new_session(new_line); +#elif HAVE_PTH_H + if (control_block.threads) + { + pth_attr_t attr; + pth_t child_thread; + + pth_attr_init (attr); + pth_attr_set (attr, PTH_ATTR_JOINABLE, FALSE); + child_thread = pth_spawn (attr, new_session, new_line); + pth_attr_destroy (attr); + } + else + new_session(new_line); +#endif + #else new_session(new_line); #endif diff --git a/util/nmem.c b/util/nmem.c index ceb8210..a2255b2 100644 --- a/util/nmem.c +++ b/util/nmem.c @@ -1,10 +1,13 @@ /* - * Copyright (c) 1995-2000, Index Data. + * Copyright (c) 1995-2001, Index Data. * See the file LICENSE for details. * Sebastian Hammer, Adam Dickmeiss * * $Log: nmem.c,v $ - * Revision 1.27 2001-09-27 12:09:18 adam + * Revision 1.28 2001-10-03 23:55:18 adam + * GNU threads support. + * + * Revision 1.27 2001/09/27 12:09:18 adam * Function nmem_exit calls oid_exit (when reference is 0). * * Revision 1.26 2001/07/19 19:51:42 adam @@ -108,14 +111,16 @@ #include #include #include + #ifdef WIN32 #include -#elif _REENTRANT +#endif +#ifdef _REENTRANT #if HAVE_PTHREAD_H #include -#elif HAVE_THREAD_H -#include +#elif HAVE_PTH_H +#include #endif #endif @@ -126,21 +131,37 @@ static CRITICAL_SECTION critical_section; #define NMEM_ENTER EnterCriticalSection(&critical_section) #define NMEM_LEAVE LeaveCriticalSection(&critical_section) -#elif _REENTRANT +#endif + +#ifdef _REENTRANT +#if HAVE_PTHREAD_H static pthread_mutex_t nmem_mutex = PTHREAD_MUTEX_INITIALIZER; #define NMEM_ENTER pthread_mutex_lock(&nmem_mutex); #define NMEM_LEAVE pthread_mutex_unlock(&nmem_mutex); +#elif HAVE_PTH_H +static pth_mutex_t nmem_mutex; +#define NMEM_ENTER pth_mutex_acquire(&nmem_mutex, 0, 0) +#define NMEM_LEAVE pth_mutex_release(&nmem_mutex) +#else +#error x +#endif #else #define NMEM_ENTER #define NMEM_LEAVE #endif - struct nmem_mutex { #ifdef WIN32 CRITICAL_SECTION m_handle; -#elif _REENTRANT +#endif +#if _REENTRANT + +#if HAVE_PTHREAD_H pthread_mutex_t m_handle; +#elif HAVE_PTH_H + pth_mutex_t m_handle; +#endif + #else int m_handle; #endif @@ -458,6 +479,10 @@ void nmem_init (void) { #ifdef WIN32 InitializeCriticalSection(&critical_section); +#elif HAVE_PTH_H +#ifdef __REENTRANT + pth_mutex_init (&nmem_mutex); +#endif #endif nmem_active_no = 0; freelist = NULL; -- 1.7.10.4