diff --git a/configure b/configure index 8cf54d94de2..655561ee772 100755 --- a/configure +++ b/configure @@ -308,7 +308,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS OPTIONS WIN16_FILES WIN16_INSTALL build build_cpu build_vendor build_os host host_cpu host_vendor host_os SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP TOOLSDIR X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS YACC LEX LEXLIB LEX_OUTPUT_ROOT XYACC XLEX AS ac_ct_AS LD ac_ct_LD AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP WINDRES ac_ct_WINDRES LN_S LN C2MAN LDCONFIG INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LINT LINTFLAGS DB2HTML DB2PDF DB2PS JPEGLIB EGREP GIFLIB XLIB XFILES OPENGLFILES GLU32FILES OPENGL_LIBS NASLIBS CURSESLIBS sane_devel SANELIBS SANEINCL ft_devel ft_devel2 FREETYPEINCL ARTSCCONFIG ARTSLIBS ARTSINCL ALSALIBS AUDIOIOLIBS DLLEXT DLLFLAGS DLLIBS LDDLLFLAGS LDSHARED LIBEXT IMPLIBEXT DLLTOOL ac_ct_DLLTOOL DLLWRAP ac_ct_DLLWRAP LDEXECFLAGS CROSSTEST CROSSCC LDPATH CRTLIBS LDD ALLOCA LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS OPTIONS WIN16_FILES WIN16_INSTALL LIBPTHREAD build build_cpu build_vendor build_os host host_cpu host_vendor host_os SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP TOOLSDIR X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS YACC LEX LEXLIB LEX_OUTPUT_ROOT XYACC XLEX AS ac_ct_AS LD ac_ct_LD AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP WINDRES ac_ct_WINDRES LN_S LN C2MAN LDCONFIG INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LINT LINTFLAGS DB2HTML DB2PDF DB2PS JPEGLIB EGREP GIFLIB XLIB XFILES OPENGLFILES GLU32FILES OPENGL_LIBS NASLIBS CURSESLIBS sane_devel SANELIBS SANEINCL ft_devel ft_devel2 FREETYPEINCL ARTSCCONFIG ARTSLIBS ARTSINCL ALSALIBS AUDIOIOLIBS DLLEXT DLLFLAGS DLLIBS LDDLLFLAGS LDSHARED LIBEXT IMPLIBEXT DLLTOOL ac_ct_DLLTOOL DLLWRAP ac_ct_DLLWRAP LDEXECFLAGS CROSSTEST CROSSCC LDPATH CRTLIBS LDD ALLOCA LIBOBJS LTLIBOBJS' ac_subst_files='MAKE_RULES MAKE_DLL_RULES MAKE_TEST_RULES MAKE_PROG_RULES' # Initialize some variables set by options. @@ -858,6 +858,7 @@ Optional Packages: --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --without-opengl do not use OpenGL --without-curses do not use curses + --with-nptl use glibc NPTL threading support --with-wine-tools= use Wine tools from directory --with-x use the X Window System @@ -1345,6 +1346,12 @@ if test "${with_curses+set}" = set; then fi; +# Check whether --with-nptl or --without-nptl was given. +if test "${with_nptl+set}" = set; then + withval="$with_nptl" + +fi; + # Check whether --with-wine-tools or --without-wine-tools was given. if test "${with_wine_tools+set}" = set; then withval="$with_wine_tools" @@ -1377,6 +1384,16 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi +if test "x$with_nptl" = "xyes" +then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_NPTL 1 +_ACEOF + + LIBPTHREAD="-lpthread" + +fi # Make sure we can run config.sub. @@ -16739,6 +16756,7 @@ s,@LIBS@,$LIBS,;t t s,@OPTIONS@,$OPTIONS,;t t s,@WIN16_FILES@,$WIN16_FILES,;t t s,@WIN16_INSTALL@,$WIN16_INSTALL,;t t +s,@LIBPTHREAD@,$LIBPTHREAD,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t diff --git a/configure.ac b/configure.ac index eeadc297847..c2e8284ed0a 100644 --- a/configure.ac +++ b/configure.ac @@ -18,6 +18,7 @@ AC_ARG_ENABLE(trace, AC_HELP_STRING([--disable-trace],[compile out TRACE message AC_ARG_WITH(opengl, AC_HELP_STRING([--without-opengl],[do not use OpenGL])) AC_ARG_WITH(curses, AC_HELP_STRING([--without-curses],[do not use curses])) +AC_ARG_WITH(nptl, AC_HELP_STRING([--with-nptl],[use glibc NPTL threading support])) AC_ARG_WITH(wine-tools,AC_HELP_STRING([--with-wine-tools=],[use Wine tools from directory ])) AC_SUBST(OPTIONS) @@ -36,6 +37,11 @@ if test "x$enable_trace" = "xno" -o "x$enable_debug" = "xno" then AC_DEFINE(NO_TRACE_MSGS,1,[Define to disable trace messages.]) fi +if test "x$with_nptl" = "xyes" +then + AC_DEFINE(HAVE_NPTL,1,[Define to use glibc NPTL threading support.]) + AC_SUBST(LIBPTHREAD,"-lpthread") +fi dnl **** Check for some programs **** diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in index 3c937f5daf9..3f60cc2b53e 100644 --- a/dlls/ntdll/Makefile.in +++ b/dlls/ntdll/Makefile.in @@ -4,7 +4,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = ntdll.dll -EXTRALIBS = $(LIBUNICODE) +EXTRALIBS = $(LIBUNICODE) @LIBPTHREAD@ C_SRCS = \ $(TOPOBJDIR)/files/directory.c \ diff --git a/include/config.h.in b/include/config.h.in index 9c2327292e6..3c2c5641456 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -341,6 +341,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_NET_IF_H +/* Define to use glibc NPTL threading support. */ +#undef HAVE_NPTL + /* Define to 1 if the system has the type `off_t'. */ #undef HAVE_OFF_T diff --git a/libs/wine/errno.c b/libs/wine/errno.c index 081221f8a1b..ee465e1bff9 100644 --- a/libs/wine/errno.c +++ b/libs/wine/errno.c @@ -22,8 +22,12 @@ #include +#ifndef HAVE_NPTL + /*********************************************************************** * pthread functions + * + * FIXME: should find a better place for these */ #ifndef HAVE_PTHREAD_GETSPECIFIC void pthread_getspecific() { assert(0); } @@ -44,3 +48,5 @@ void pthread_mutex_unlock() { assert(0); } #ifndef HAVE_PTHREAD_SETSPECIFIC void pthread_setspecific() { assert(0); } #endif + +#endif /* HAVE_NPTL */ diff --git a/scheduler/pthread.c b/scheduler/pthread.c index 456be1316ca..59618835911 100644 --- a/scheduler/pthread.c +++ b/scheduler/pthread.c @@ -46,7 +46,7 @@ struct _pthread_cleanup_buffer; * If they are not available, the libc defaults to * non-threadsafe operation (not good). */ -#if defined(__GLIBC__) || defined(__FreeBSD__) +#if (defined(__GLIBC__) || defined(__FreeBSD__)) && !defined(HAVE_NPTL) #ifndef __USE_UNIX98 #define __USE_UNIX98 diff --git a/scheduler/sysdeps.c b/scheduler/sysdeps.c index a996e64ae8b..38c71e56092 100644 --- a/scheduler/sysdeps.c +++ b/scheduler/sysdeps.c @@ -45,6 +45,10 @@ #include #endif +#ifdef HAVE_NPTL +#include +#endif + #include "thread.h" #include "wine/server.h" #include "winbase.h" @@ -175,9 +179,18 @@ static void SYSDEPS_StartThread( TEB *teb ) */ int SYSDEPS_SpawnThread( TEB *teb ) { -#ifdef HAVE_CLONE +#ifdef HAVE_NPTL + pthread_t id; + pthread_attr_t attr; + + pthread_attr_init( &attr ); + pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED ); + pthread_attr_setstack( &attr, teb->stack_base, (char *)teb->stack_top - (char *)teb->stack_base ); + if (pthread_create( &id, &attr, (void * (*)(void *))SYSDEPS_StartThread, teb )) return -1; + return 0; +#elif defined(HAVE_CLONE) if (clone( (int (*)(void *))SYSDEPS_StartThread, teb->stack_top, - CLONE_VM | CLONE_FS | CLONE_FILES, teb ) < 0) + CLONE_VM | CLONE_FS | CLONE_FILES | SIGCHLD, teb ) < 0) return -1; return 0; #elif defined(HAVE_RFORK) @@ -284,8 +297,11 @@ void SYSDEPS_ExitThread( int status ) info.status = status; SIGNAL_Block(); - SIGNAL_Reset(); +#ifdef HAVE_NPTL + SYSDEPS_AbortThread( status ); +#else + SIGNAL_Reset(); VirtualFree( teb->stack_base, 0, MEM_RELEASE | MEM_SYSTEM ); close( teb->wait_fd[0] ); close( teb->wait_fd[1] ); @@ -294,6 +310,7 @@ void SYSDEPS_ExitThread( int status ) teb->stack_low = get_temp_stack(); teb->stack_top = (char *) teb->stack_low + TEMP_STACK_SIZE; SYSDEPS_CallOnStack( cleanup_thread, &info ); +#endif } @@ -305,11 +322,14 @@ void SYSDEPS_ExitThread( int status ) void SYSDEPS_AbortThread( int status ) { SIGNAL_Block(); - SIGNAL_Reset(); close( NtCurrentTeb()->wait_fd[0] ); close( NtCurrentTeb()->wait_fd[1] ); close( NtCurrentTeb()->reply_fd ); close( NtCurrentTeb()->request_fd ); +#ifdef HAVE_NPTL + pthread_exit( (void *)status ); +#endif + SIGNAL_Reset(); #ifdef HAVE__LWP_CREATE _lwp_exit(); #endif @@ -337,6 +357,8 @@ int SYSDEPS_GetUnixTid(void) } +#ifndef HAVE_NPTL + /* default errno before threading is initialized */ static int *default_errno_location(void) { @@ -387,6 +409,7 @@ int *__h_errno_location(void) return h_errno_location_ptr(); } +#endif /* HAVE_NPTL */ /*********************************************************************** * SYSDEPS_InitErrno @@ -395,8 +418,10 @@ int *__h_errno_location(void) */ void SYSDEPS_InitErrno(void) { +#ifndef HAVE_NPTL errno_location_ptr = thread_errno_location; h_errno_location_ptr = thread_h_errno_location; +#endif }