From a628c13e90cc5cfbc57f938728e00582a57533cb Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 12 Nov 2003 03:28:21 +0000 Subject: [PATCH] Added a wine-glibc binary that detects the glibc threading in use and execs the corresponding wine binary. Removed the --with-nptl configure option. --- configure | 17 +------- configure.ac | 10 +---- loader/.cvsignore | 1 + loader/Makefile.in | 4 ++ loader/glibc.c | 104 +++++++++++++++++++++++++++++++++++++++++++++ tools/wineinstall | 5 --- 6 files changed, 113 insertions(+), 28 deletions(-) create mode 100644 loader/glibc.c diff --git a/configure b/configure index 166764533c9..e2fcaaf8837 100755 --- a/configure +++ b/configure @@ -858,7 +858,6 @@ 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 @@ -1346,12 +1345,6 @@ 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" @@ -12635,16 +12628,10 @@ esac case $host_os in linux*) - WINE_BINARIES="wine-kthread wine-pthread" + WINE_BINARIES="wine-glibc wine-kthread wine-pthread" - if test "x$with_nptl" = "xyes" - then - MAIN_BINARY="wine-pthread" + MAIN_BINARY="wine-glibc" - else - MAIN_BINARY="wine-kthread" - - fi ;; *) WINE_BINARIES="wine-kthread" diff --git a/configure.ac b/configure.ac index 78c69de46d8..5d37e8e4504 100644 --- a/configure.ac +++ b/configure.ac @@ -18,7 +18,6 @@ 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(WIN16_FILES,"\$(WIN16_FILES)") @@ -934,13 +933,8 @@ esac case $host_os in linux*) - AC_SUBST(WINE_BINARIES,"wine-kthread wine-pthread") - if test "x$with_nptl" = "xyes" - then - AC_SUBST(MAIN_BINARY,"wine-pthread") - else - AC_SUBST(MAIN_BINARY,"wine-kthread") - fi + AC_SUBST(WINE_BINARIES,"wine-glibc wine-kthread wine-pthread") + AC_SUBST(MAIN_BINARY,"wine-glibc") ;; *) AC_SUBST(WINE_BINARIES,"wine-kthread") diff --git a/loader/.cvsignore b/loader/.cvsignore index d647d8e489a..8e637dd8755 100644 --- a/loader/.cvsignore +++ b/loader/.cvsignore @@ -1,4 +1,5 @@ Makefile wine +wine-glibc wine-kthread wine-pthread diff --git a/loader/Makefile.in b/loader/Makefile.in index 5307e8055c5..d4999ba36a7 100644 --- a/loader/Makefile.in +++ b/loader/Makefile.in @@ -5,6 +5,7 @@ VPATH = @srcdir@ MODULE = wine C_SRCS = \ + glibc.c \ kthread.c \ main.c \ pthread.c @@ -22,6 +23,9 @@ all: $(WINE_BINARIES) $(MODULE) LIBPTHREAD = @LIBPTHREAD@ LDEXECFLAGS = @LDEXECFLAGS@ +wine-glibc: glibc.o Makefile.in + $(CC) -o $@ $(LDEXECFLAGS) glibc.o $(LIBWINE) $(LIBPORT) $(LIBPTHREAD) $(EXTRALIBS) $(LDFLAGS) + wine-kthread: $(KTHREAD_OBJS) Makefile.in $(CC) -o $@ $(LDEXECFLAGS) $(KTHREAD_OBJS) $(LIBWINE) $(LIBPORT) $(EXTRALIBS) $(LDFLAGS) diff --git a/loader/glibc.c b/loader/glibc.c new file mode 100644 index 00000000000..1f359b5c035 --- /dev/null +++ b/loader/glibc.c @@ -0,0 +1,104 @@ +/* + * glibc threading support + * + * Copyright 2003 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#include +#include +#include +#include + +#include "wine/library.h" + +/* malloc wrapper */ +static void *xmalloc( size_t size ) +{ + void *res; + + if (!size) size = 1; + if (!(res = malloc( size ))) + { + fprintf( stderr, "wine: virtual memory exhausted\n" ); + exit(1); + } + return res; +} + +/* separate thread to check for NPTL and TLS features */ +static void *needs_pthread( void *arg ) +{ + pid_t tid = gettid(); + /* check for NPTL */ + if (tid != -1 && tid != getpid()) return (void *)1; + /* check for TLS glibc */ + return (void *)(wine_get_gs() != 0); +} + +/* return the name of the Wine threading variant to use */ +static const char *get_threading(void) +{ + pthread_t id; + void *ret; + + pthread_create( &id, NULL, needs_pthread, NULL ); + pthread_join( id, &ret ); + return ret ? "-pthread" : "-kthread"; +} + + +/********************************************************************** + * main + */ +int main( int argc, char *argv[] ) +{ + const char *loader = getenv( "WINELOADER" ); + const char *threads = get_threading(); + const char *name; + char *new_name; + + if (!(name = loader)) + { + /* if no WINELOADER specified, get base name of argv[0] */ + if ((name = strrchr( argv[0], '/' ))) name++; + else name = argv[0]; + } + new_name = xmalloc( strlen(name) + strlen(threads) + 1 ); + strcpy( new_name, name ); + strcat( new_name, threads ); + + if (loader) + { + /* update WINELOADER with the new name */ + char *new_loader = xmalloc( sizeof("WINELOADER=") + strlen(new_name) ); + strcpy( new_loader, "WINELOADER=" ); + strcat( new_loader, new_name ); + putenv( new_loader ); + argv[0] = new_name; + execv( argv[0], argv ); + } + else + { + wine_init_argv0_path( argv[0] ); + wine_exec_wine_binary( new_name, argv, NULL ); + } + fprintf( stderr, "wine: could not exec %s\n", argv[0] ); + exit(1); +} diff --git a/tools/wineinstall b/tools/wineinstall index c4af41a88c7..f4c17ee8a6a 100755 --- a/tools/wineinstall +++ b/tools/wineinstall @@ -152,11 +152,6 @@ function configure_wine_applications { echo "WINE Installer v0.74" echo -# check for redhat 9 with tls libs so we can enable --with-nptl until runtime detection is complete -if [ -e /etc/redhat-release ] && grep "Shrike" /etc/redhat-release &>/dev/null && [ -e /lib/tls ]; then - CONFARGS="$CONFARGS --with-nptl" -fi - if [ "$BINDIST" = 'no' ] then {