Added a wine-glibc binary that detects the glibc threading in use and

execs the corresponding wine binary.
Removed the --with-nptl configure option.
This commit is contained in:
Alexandre Julliard 2003-11-12 03:28:21 +00:00
parent b2d937d5d9
commit a628c13e90
6 changed files with 113 additions and 28 deletions

17
configure vendored
View file

@ -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=<dir> use Wine tools from directory <dir>
--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"

View file

@ -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=<dir>],[use Wine tools from directory <dir>]))
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")

View file

@ -1,4 +1,5 @@
Makefile
wine
wine-glibc
wine-kthread
wine-pthread

View file

@ -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)

104
loader/glibc.c Normal file
View file

@ -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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#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);
}

View file

@ -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 {