Makefile.in (GTHREAD_FLAGS): New var.
* Makefile.in (GTHREAD_FLAGS): New var. (LIBGCC2_CFLAGS): Added $(GTHREAD_FLAGS). (distclean): Remove gthr-default.h. * configure.in: Accept dce as a thread package. Check for thread.h and pthread.h. Link gthr-default.h to appropriate thread file and set gthread_flags. (hppa1.1-*-hpux10*): If --enable-threads, use dce threads and include multilib definitions from pa/t-dce-thr. (sparc-*-solaris2*): Enable threads by default, if thread.h or pthread.h is found, preferring posix threads over solaris ones. * config/pa/t-dce-thr: New file. * config/pa/t-pa: Removed multilibs. * config/sparc/t-sol2: Ditto. * gthr.h: New file. * gthr-single.h: New file. * gthr-posix.h: New file. * gthr-solaris.h: New file. * gthr-dce.h: New file. * libgcc-thr.h: Removed. * objc/thr-dce.c: New file copied from thr-decosf1.c. * frame.c: Include gthr.h instead of libgcc-thr.h. * libgcc2.c: Include gthr.h instead of libgcc-thr.h. (eh_context_initialize): If __gthread_once fails, use static eh context. (eh_context_free): Call __gthread_key_dtor. From-SVN: r17235
This commit is contained in:
parent
df3b6ab30e
commit
f24af81bca
@ -1,3 +1,36 @@
|
|||||||
|
1997-12-25 Teemu Torma <tot@trema.com>
|
||||||
|
|
||||||
|
* Makefile.in (GTHREAD_FLAGS): New var.
|
||||||
|
(LIBGCC2_CFLAGS): Added $(GTHREAD_FLAGS).
|
||||||
|
(distclean): Remove gthr-default.h.
|
||||||
|
|
||||||
|
* configure.in: Accept dce as a thread package.
|
||||||
|
Check for thread.h and pthread.h.
|
||||||
|
Link gthr-default.h to appropriate thread file and set
|
||||||
|
gthread_flags.
|
||||||
|
(hppa1.1-*-hpux10*): If --enable-threads, use dce threads and
|
||||||
|
include multilib definitions from pa/t-dce-thr.
|
||||||
|
(sparc-*-solaris2*): Enable threads by default, if thread.h or
|
||||||
|
pthread.h is found, preferring posix threads over solaris ones.
|
||||||
|
|
||||||
|
* config/pa/t-dce-thr: New file.
|
||||||
|
* config/pa/t-pa: Removed multilibs.
|
||||||
|
* config/sparc/t-sol2: Ditto.
|
||||||
|
|
||||||
|
* gthr.h: New file.
|
||||||
|
* gthr-single.h: New file.
|
||||||
|
* gthr-posix.h: New file.
|
||||||
|
* gthr-solaris.h: New file.
|
||||||
|
* gthr-dce.h: New file.
|
||||||
|
* libgcc-thr.h: Removed.
|
||||||
|
* objc/thr-dce.c: New file copied from thr-decosf1.c.
|
||||||
|
|
||||||
|
* frame.c: Include gthr.h instead of libgcc-thr.h.
|
||||||
|
* libgcc2.c: Include gthr.h instead of libgcc-thr.h.
|
||||||
|
(eh_context_initialize): If __gthread_once fails, use static eh
|
||||||
|
context.
|
||||||
|
(eh_context_free): Call __gthread_key_dtor.
|
||||||
|
|
||||||
Wed Dec 24 23:33:17 1997 Jeffrey A Law (law@cygnus.com)
|
Wed Dec 24 23:33:17 1997 Jeffrey A Law (law@cygnus.com)
|
||||||
|
|
||||||
* expr.h (MUST_PASS_IN_STACK): Allow target port to override.
|
* expr.h (MUST_PASS_IN_STACK): Allow target port to override.
|
||||||
|
@ -206,6 +206,7 @@ host_xm_file=@host_xm_file_list@
|
|||||||
lang_specs_files=@lang_specs_files@
|
lang_specs_files=@lang_specs_files@
|
||||||
lang_options_files=@lang_options_files@
|
lang_options_files=@lang_options_files@
|
||||||
GCC_THREAD_FILE=@thread_file@
|
GCC_THREAD_FILE=@thread_file@
|
||||||
|
GTHREAD_FLAGS=@gthread_flags@
|
||||||
version=@version@
|
version=@version@
|
||||||
mainversion=`sed -e 's/.*\"\([0-9]*\.[0-9]*\).*/\1/' < $(srcdir)/version.c`
|
mainversion=`sed -e 's/.*\"\([0-9]*\.[0-9]*\).*/\1/' < $(srcdir)/version.c`
|
||||||
|
|
||||||
@ -281,7 +282,7 @@ LIBGCC2 = libgcc2.a
|
|||||||
# -fexceptions is necessary for eh.o now that the exceptions are
|
# -fexceptions is necessary for eh.o now that the exceptions are
|
||||||
# the default for g++ only.
|
# the default for g++ only.
|
||||||
LIBGCC2_DEBUG_CFLAGS = -g1
|
LIBGCC2_DEBUG_CFLAGS = -g1
|
||||||
LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) $(LIBGCC2_DEBUG_CFLAGS) -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -fexceptions @inhibit_libc@
|
LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) $(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS) -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -fexceptions @inhibit_libc@
|
||||||
|
|
||||||
# Additional options to use when compiling libgcc2.a.
|
# Additional options to use when compiling libgcc2.a.
|
||||||
# Some targets override this to -Iinclude
|
# Some targets override this to -Iinclude
|
||||||
@ -2157,6 +2158,7 @@ distclean: clean bytecode.distclean lang.distclean
|
|||||||
-rm -f config.status config.run config.cache config.bak
|
-rm -f config.status config.run config.cache config.bak
|
||||||
-rm -f Make-lang Make-hooks Make-host Make-target
|
-rm -f Make-lang Make-hooks Make-host Make-target
|
||||||
-rm -f Makefile specs.h options.h *.oaux
|
-rm -f Makefile specs.h options.h *.oaux
|
||||||
|
-rm -f gthr-default.h
|
||||||
-rm -f */stage1 */stage2 */stage3 */stage4 */include
|
-rm -f */stage1 */stage2 */stage3 */stage4 */include
|
||||||
-rm -f c-parse.output
|
-rm -f c-parse.output
|
||||||
-rm -f *.asm
|
-rm -f *.asm
|
||||||
|
5
gcc/config/pa/t-dce-thr
Normal file
5
gcc/config/pa/t-dce-thr
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
MULTILIB_OPTIONS = threads
|
||||||
|
MULTILIB_DIRNAMES = threads
|
||||||
|
|
||||||
|
LIBGCC = stmp-multilib
|
||||||
|
INSTALL_LIBGCC = install-multilib
|
@ -16,9 +16,3 @@ ee_fp.asm: $(srcdir)/config/pa/ee_fp.asm
|
|||||||
cp $(srcdir)/config/pa/ee_fp.asm .
|
cp $(srcdir)/config/pa/ee_fp.asm .
|
||||||
|
|
||||||
TARGET_LIBGCC2_CFLAGS = -fPIC
|
TARGET_LIBGCC2_CFLAGS = -fPIC
|
||||||
|
|
||||||
MULTILIB_OPTIONS = threads
|
|
||||||
MULTILIB_DIRNAMES = threads
|
|
||||||
|
|
||||||
LIBGCC = stmp-multilib
|
|
||||||
INSTALL_LIBGCC = install-multilib
|
|
||||||
|
@ -5,13 +5,6 @@ LIBGCC1 =
|
|||||||
CROSS_LIBGCC1 =
|
CROSS_LIBGCC1 =
|
||||||
LIBGCC1_TEST =
|
LIBGCC1_TEST =
|
||||||
|
|
||||||
MULTILIB_OPTIONS = threads
|
|
||||||
MULTILIB_DIRNAMES = threads
|
|
||||||
MULTILIB_MATCHES = threads=pthreads
|
|
||||||
|
|
||||||
LIBGCC = stmp-multilib
|
|
||||||
INSTALL_LIBGCC = install-multilib
|
|
||||||
|
|
||||||
# gmon build rule:
|
# gmon build rule:
|
||||||
gmon.o: $(srcdir)/config/sparc/gmon-sol2.c $(GCC_PASSES) $(CONFIG_H) stmp-int-hdrs
|
gmon.o: $(srcdir)/config/sparc/gmon-sol2.c $(GCC_PASSES) $(CONFIG_H) stmp-int-hdrs
|
||||||
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) \
|
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) \
|
||||||
|
362
gcc/configure
vendored
362
gcc/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -114,7 +114,7 @@ case x${enable_threads} in
|
|||||||
thread_file=''
|
thread_file=''
|
||||||
;;
|
;;
|
||||||
xdecosf1 | xirix | xmach | xos2 | xposix | xpthreads | xsingle | \
|
xdecosf1 | xirix | xmach | xos2 | xposix | xpthreads | xsingle | \
|
||||||
xsolaris | xwin32)
|
xsolaris | xwin32 | xdce)
|
||||||
thread_file=$enable_threads
|
thread_file=$enable_threads
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@ -147,6 +147,10 @@ AC_HEADER_STDC
|
|||||||
AC_HEADER_TIME
|
AC_HEADER_TIME
|
||||||
AC_CHECK_HEADERS(limits.h stddef.h string.h strings.h stdlib.h time.h fcntl.h unistd.h sys/file.h sys/time.h sys/resource.h sys/param.h sys/times.h varargs.h sys/varargs.h)
|
AC_CHECK_HEADERS(limits.h stddef.h string.h strings.h stdlib.h time.h fcntl.h unistd.h sys/file.h sys/time.h sys/resource.h sys/param.h sys/times.h varargs.h sys/varargs.h)
|
||||||
|
|
||||||
|
# Check for thread headers.
|
||||||
|
AC_CHECK_HEADER(thread.h, [have_thread_h=yes], [have_thread_h=])
|
||||||
|
AC_CHECK_HEADER(pthread.h, [have_pthread_h=yes], [have_pthread_h=])
|
||||||
|
|
||||||
# Use <inttypes.h> only if it exists,
|
# Use <inttypes.h> only if it exists,
|
||||||
# doesn't clash with <sys/types.h>, and declares intmax_t.
|
# doesn't clash with <sys/types.h>, and declares intmax_t.
|
||||||
AC_MSG_CHECKING(for inttypes.h)
|
AC_MSG_CHECKING(for inttypes.h)
|
||||||
@ -637,10 +641,18 @@ for machine in $build $host $target; do
|
|||||||
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h"
|
tm_file="${tm_file} pa/pa-hpux.h pa/pa-hpux10.h"
|
||||||
xm_file=pa/xm-pahpux.h
|
xm_file=pa/xm-pahpux.h
|
||||||
xmake_file=pa/x-pa-hpux
|
xmake_file=pa/x-pa-hpux
|
||||||
|
tmake_file=pa/t-pa
|
||||||
if [[ x$gas = xyes ]]
|
if [[ x$gas = xyes ]]
|
||||||
then
|
then
|
||||||
tm_file="${tm_file} pa/pa-gas.h"
|
tm_file="${tm_file} pa/pa-gas.h"
|
||||||
fi
|
fi
|
||||||
|
if [[ x$enable_threads = x ]]; then
|
||||||
|
enable_threads=$have_pthread_h
|
||||||
|
fi
|
||||||
|
if [[ x$enable_threads = xyes ]]; then
|
||||||
|
thread_file='dce'
|
||||||
|
tmake_file="${tmake_file} pa/t-dce-thr"
|
||||||
|
fi
|
||||||
install_headers_dir=install-headers-cpio
|
install_headers_dir=install-headers-cpio
|
||||||
use_collect2=yes
|
use_collect2=yes
|
||||||
;;
|
;;
|
||||||
@ -2480,8 +2492,18 @@ for machine in $build $host $target; do
|
|||||||
fixincludes=fixinc.svr4
|
fixincludes=fixinc.svr4
|
||||||
float_format=i128
|
float_format=i128
|
||||||
broken_install=yes
|
broken_install=yes
|
||||||
if [[ x$enable_threads = xyes ]]; then
|
if [[ x${enable_threads} = x ]]; then
|
||||||
|
enable_threads=$have_pthread_h
|
||||||
|
if [[ x${enable_threads} = x ]]; then
|
||||||
|
enable_threads=$have_thread_h
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [[ x${enable_threads} = xyes ]]; then
|
||||||
|
if [[ x${have_pthread_h} = xyes ]]; then
|
||||||
|
thread_file='posix'
|
||||||
|
else
|
||||||
thread_file='solaris'
|
thread_file='solaris'
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
sparc-*-sunos4.0*)
|
sparc-*-sunos4.0*)
|
||||||
@ -3078,6 +3100,15 @@ do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Make gthr-default.h if we have a thread file.
|
||||||
|
gthread_flags=
|
||||||
|
if [[ $thread_file != single ]]; then
|
||||||
|
rm -f gthr-default.h
|
||||||
|
$symbolic_link gthr-${thread_file}.h gthr-default.h
|
||||||
|
gthread_flags=-DHAVE_GTHR_DEFAULT
|
||||||
|
fi
|
||||||
|
AC_SUBST(gthread_flags)
|
||||||
|
|
||||||
# Make empty files to contain the specs and options for each language.
|
# Make empty files to contain the specs and options for each language.
|
||||||
# Then add #include lines to for a compiler that has specs and/or options.
|
# Then add #include lines to for a compiler that has specs and/or options.
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ Boston, MA 02111-1307, USA. */
|
|||||||
#include "dwarf2.h"
|
#include "dwarf2.h"
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include "libgcc-thr.h"
|
#include "gthr.h"
|
||||||
|
|
||||||
#ifdef __GTHREAD_MUTEX_INIT
|
#ifdef __GTHREAD_MUTEX_INIT
|
||||||
static __gthread_mutex_t object_mutex = __GTHREAD_MUTEX_INIT;
|
static __gthread_mutex_t object_mutex = __GTHREAD_MUTEX_INIT;
|
||||||
|
150
gcc/gthr-dce.h
Normal file
150
gcc/gthr-dce.h
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
|
||||||
|
/* Compile this one with gcc. */
|
||||||
|
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
GNU CC is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GNU CC 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 General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with GNU CC; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, if you link this library with other files,
|
||||||
|
some of which are compiled with GCC, to produce an executable,
|
||||||
|
this library does not by itself cause the resulting executable
|
||||||
|
to be covered by the GNU General Public License.
|
||||||
|
This exception does not however invalidate any other reasons why
|
||||||
|
the executable file might be covered by the GNU General Public License. */
|
||||||
|
|
||||||
|
#ifndef __gthr_dce_h
|
||||||
|
#define __gthr_dce_h
|
||||||
|
|
||||||
|
/* DCE threads interface.
|
||||||
|
DCE threads are based on POSIX threads draft 4, and many things
|
||||||
|
have changed since then. */
|
||||||
|
|
||||||
|
#define __GTHREADS 1
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
typedef pthread_key_t __gthread_key_t;
|
||||||
|
typedef pthread_once_t __gthread_once_t;
|
||||||
|
typedef pthread_mutex_t __gthread_mutex_t;
|
||||||
|
|
||||||
|
#define __GTHREAD_ONCE_INIT pthread_once_init
|
||||||
|
/* Howto define __GTHREAD_MUTEX_INIT? */
|
||||||
|
|
||||||
|
#if SUPPORTS_WEAK && GTHREAD_USE_WEAK
|
||||||
|
|
||||||
|
#pragma weak pthread_once
|
||||||
|
#pragma weak pthread_once_init
|
||||||
|
#pragma weak pthread_key_create
|
||||||
|
#pragma weak pthread_key_delete
|
||||||
|
#pragma weak pthread_getspecific
|
||||||
|
#pragma weak pthread_setspecific
|
||||||
|
#pragma weak pthread_create
|
||||||
|
|
||||||
|
#pragma weak pthread_mutex_lock
|
||||||
|
#pragma weak pthread_mutex_trylock
|
||||||
|
#pragma weak pthread_mutex_unlock
|
||||||
|
|
||||||
|
static void *__gthread_active_ptr = &pthread_create;
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_active_p ()
|
||||||
|
{
|
||||||
|
return __gthread_active_ptr != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* not SUPPORTS_WEAK */
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_active_p ()
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SUPPORTS_WEAK */
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_once (__gthread_once_t *once, void (*func) ())
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return pthread_once (once, func);
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_key_create (__gthread_key_t *key, void (*dtor) (void *))
|
||||||
|
{
|
||||||
|
return pthread_keycreate (key, dtor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_key_dtor (__gthread_key_t key, void *ptr)
|
||||||
|
{
|
||||||
|
/* Nothing needed. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_key_delete (__gthread_key_t key)
|
||||||
|
{
|
||||||
|
return pthread_key_delete (key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
__gthread_getspecific (__gthread_key_t key)
|
||||||
|
{
|
||||||
|
void *ptr;
|
||||||
|
if (pthread_getspecific (key, &ptr) == 0)
|
||||||
|
return ptr;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_setspecific (__gthread_key_t key, const void *ptr)
|
||||||
|
{
|
||||||
|
return pthread_setspecific (key, (void *) ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_lock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return pthread_mutex_lock (mutex);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_trylock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return pthread_mutex_trylock (mutex);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_unlock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return pthread_mutex_unlock (mutex);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* not __gthr_dce_h */
|
147
gcc/gthr-posix.h
Normal file
147
gcc/gthr-posix.h
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
/* Threads compatibily routines for libgcc2. */
|
||||||
|
/* Compile this one with gcc. */
|
||||||
|
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
GNU CC is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GNU CC 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 General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with GNU CC; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, if you link this library with other files,
|
||||||
|
some of which are compiled with GCC, to produce an executable,
|
||||||
|
this library does not by itself cause the resulting executable
|
||||||
|
to be covered by the GNU General Public License.
|
||||||
|
This exception does not however invalidate any other reasons why
|
||||||
|
the executable file might be covered by the GNU General Public License. */
|
||||||
|
|
||||||
|
#ifndef __gthr_posix_h
|
||||||
|
#define __gthr_posix_h
|
||||||
|
|
||||||
|
/* POSIX threads specific definitions.
|
||||||
|
Easy, since the interface is just one-to-one mapping. */
|
||||||
|
|
||||||
|
#define __GTHREADS 1
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
typedef pthread_key_t __gthread_key_t;
|
||||||
|
typedef pthread_once_t __gthread_once_t;
|
||||||
|
typedef pthread_mutex_t __gthread_mutex_t;
|
||||||
|
|
||||||
|
#define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
|
||||||
|
#define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT
|
||||||
|
|
||||||
|
#if SUPPORTS_WEAK && GTHREAD_USE_WEAK
|
||||||
|
|
||||||
|
#pragma weak pthread_once
|
||||||
|
#pragma weak pthread_key_create
|
||||||
|
#pragma weak pthread_key_delete
|
||||||
|
#pragma weak pthread_getspecific
|
||||||
|
#pragma weak pthread_setspecific
|
||||||
|
#pragma weak pthread_create
|
||||||
|
|
||||||
|
#pragma weak pthread_mutex_lock
|
||||||
|
#pragma weak pthread_mutex_trylock
|
||||||
|
#pragma weak pthread_mutex_unlock
|
||||||
|
|
||||||
|
static void *__gthread_active_ptr = &pthread_create;
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_active_p ()
|
||||||
|
{
|
||||||
|
return __gthread_active_ptr != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* not SUPPORTS_WEAK */
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_active_p ()
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SUPPORTS_WEAK */
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_once (__gthread_once_t *once, void (*func) ())
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return pthread_once (once, func);
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_key_create (__gthread_key_t *key, void (*dtor) (void *))
|
||||||
|
{
|
||||||
|
return pthread_key_create (key, dtor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_key_dtor (__gthread_key_t key, void *ptr)
|
||||||
|
{
|
||||||
|
/* Just reset the key value to zero. */
|
||||||
|
if (ptr)
|
||||||
|
return pthread_setspecific (key, 0);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_key_delete (__gthread_key_t key)
|
||||||
|
{
|
||||||
|
return pthread_key_delete (key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
__gthread_getspecific (__gthread_key_t key)
|
||||||
|
{
|
||||||
|
return pthread_getspecific (key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_setspecific (__gthread_key_t key, const void *ptr)
|
||||||
|
{
|
||||||
|
return pthread_setspecific (key, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_lock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return pthread_mutex_lock (mutex);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_trylock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return pthread_mutex_trylock (mutex);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_unlock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return pthread_mutex_unlock (mutex);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* not __gthr_posix_h */
|
62
gcc/gthr-single.h
Normal file
62
gcc/gthr-single.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/* Threads compatibily routines for libgcc2. */
|
||||||
|
/* Compile this one with gcc. */
|
||||||
|
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
GNU CC is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GNU CC 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 General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with GNU CC; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, if you link this library with other files,
|
||||||
|
some of which are compiled with GCC, to produce an executable,
|
||||||
|
this library does not by itself cause the resulting executable
|
||||||
|
to be covered by the GNU General Public License.
|
||||||
|
This exception does not however invalidate any other reasons why
|
||||||
|
the executable file might be covered by the GNU General Public License. */
|
||||||
|
|
||||||
|
#ifndef __gthr_single_h
|
||||||
|
#define __gthr_single_h
|
||||||
|
|
||||||
|
/* Just provide compatibility for mutex handling. */
|
||||||
|
|
||||||
|
typedef int __gthread_mutex_t;
|
||||||
|
|
||||||
|
#define __GTHREAD_MUTEX_INIT 0
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_active_p ()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_lock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_trylock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_unlock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* not __gthr_single_h */
|
179
gcc/gthr-solaris.h
Normal file
179
gcc/gthr-solaris.h
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
/* Threads compatibily routines for libgcc2. */
|
||||||
|
/* Compile this one with gcc. */
|
||||||
|
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
GNU CC is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GNU CC 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 General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with GNU CC; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, if you link this library with other files,
|
||||||
|
some of which are compiled with GCC, to produce an executable,
|
||||||
|
this library does not by itself cause the resulting executable
|
||||||
|
to be covered by the GNU General Public License.
|
||||||
|
This exception does not however invalidate any other reasons why
|
||||||
|
the executable file might be covered by the GNU General Public License. */
|
||||||
|
|
||||||
|
#ifndef __gthr_solaris_h
|
||||||
|
#define __gthr_solaris_h
|
||||||
|
|
||||||
|
/* Solaris threads as found in Solaris 2.[456].
|
||||||
|
Actually these are Unix International (UI) threads, but I don't
|
||||||
|
know if anyone else implements these. */
|
||||||
|
|
||||||
|
#define __GTHREADS 1
|
||||||
|
|
||||||
|
#include <thread.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
typedef thread_key_t __gthread_key_t;
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
mutex_t mutex;
|
||||||
|
int once;
|
||||||
|
} __gthread_once_t;
|
||||||
|
typedef mutex_t __gthread_mutex_t;
|
||||||
|
|
||||||
|
#define __GTHREAD_ONCE_INIT { DEFAULTMUTEX, 0 }
|
||||||
|
#define __GTHREAD_MUTEX_INIT DEFAULTMUTEX
|
||||||
|
|
||||||
|
#if SUPPORTS_WEAK && GTHREAD_USE_WEAK
|
||||||
|
|
||||||
|
#pragma weak thr_keycreate
|
||||||
|
#pragma weak thr_getspecific
|
||||||
|
#pragma weak thr_setspecific
|
||||||
|
#pragma weak thr_create
|
||||||
|
|
||||||
|
#pragma weak mutex_lock
|
||||||
|
#pragma weak mutex_trylock
|
||||||
|
#pragma weak mutex_unlock
|
||||||
|
|
||||||
|
/* This will not actually work in Solaris 2.5, since libc contains
|
||||||
|
dummy symbols of all thr_* routines. */
|
||||||
|
|
||||||
|
static void *__gthread_active_ptr = &thr_create;
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_active_p ()
|
||||||
|
{
|
||||||
|
return __gthread_active_ptr != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* not SUPPORTS_WEAK */
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_active_p ()
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SUPPORTS_WEAK */
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_once (__gthread_once_t *once, void (*func) ())
|
||||||
|
{
|
||||||
|
if (! __gthread_active_p ())
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (once == 0 || func == 0)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (once->once == 0)
|
||||||
|
{
|
||||||
|
if (mutex_lock (&once->mutex) != 0)
|
||||||
|
return -1;
|
||||||
|
if (once->once == 0)
|
||||||
|
{
|
||||||
|
(*func) ();
|
||||||
|
once->once ++;
|
||||||
|
}
|
||||||
|
mutex_unlock (&once->mutex);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_key_create (__gthread_key_t *key, void (*dtor) (void *))
|
||||||
|
{
|
||||||
|
/* Solaris 2.5 contains thr_* routines no-op in libc, so test if we actually
|
||||||
|
got a reasonable key value, and if not, fail. */
|
||||||
|
*key = -1;
|
||||||
|
if (thr_keycreate (key, dtor) == -1 || *key == -1)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_key_dtor (__gthread_key_t key, void *ptr)
|
||||||
|
{
|
||||||
|
/* Nothing needed. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_key_delete (__gthread_key_t key)
|
||||||
|
{
|
||||||
|
/* Not possible. */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
__gthread_getspecific (__gthread_key_t key)
|
||||||
|
{
|
||||||
|
void *ptr;
|
||||||
|
if (thr_getspecific (key, &ptr) == 0)
|
||||||
|
return ptr;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_setspecific (__gthread_key_t key, const void *ptr)
|
||||||
|
{
|
||||||
|
return thr_setspecific (key, (void *) ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_lock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return mutex_lock (mutex);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_trylock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return mutex_trylock (mutex);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
__gthread_mutex_unlock (__gthread_mutex_t *mutex)
|
||||||
|
{
|
||||||
|
if (__gthread_active_p ())
|
||||||
|
return mutex_unlock (mutex);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* not __gthr_solaris_h */
|
96
gcc/gthr.h
Normal file
96
gcc/gthr.h
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/* Threads compatibily routines for libgcc2. */
|
||||||
|
/* Compile this one with gcc. */
|
||||||
|
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
GNU CC is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GNU CC 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 General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with GNU CC; see the file COPYING. If not, write to
|
||||||
|
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, if you link this library with other files,
|
||||||
|
some of which are compiled with GCC, to produce an executable,
|
||||||
|
this library does not by itself cause the resulting executable
|
||||||
|
to be covered by the GNU General Public License.
|
||||||
|
This exception does not however invalidate any other reasons why
|
||||||
|
the executable file might be covered by the GNU General Public License. */
|
||||||
|
|
||||||
|
#ifndef __gthr_h
|
||||||
|
#define __gthr_h
|
||||||
|
|
||||||
|
/* If this file is compiled with threads support, it must
|
||||||
|
#define __GTHREADS 1
|
||||||
|
to indicate that threads support is present. Also it has define
|
||||||
|
function
|
||||||
|
int __gthread_active_p ()
|
||||||
|
that returns 1 if thread system is active, 0 if not.
|
||||||
|
|
||||||
|
The threads interface must define the following types:
|
||||||
|
__gthread_key_t
|
||||||
|
__gthread_once_t
|
||||||
|
__gthread_mutex_t
|
||||||
|
|
||||||
|
The threads interface must define the following macros:
|
||||||
|
|
||||||
|
__GTHREAD_ONCE_INIT
|
||||||
|
to initialize __gthread_once_t
|
||||||
|
__GTHREAD_MUTEX_INIT
|
||||||
|
to initialize __gthread_mutex_t to get a fast
|
||||||
|
non-recursive mutex.
|
||||||
|
|
||||||
|
The threads interface must define the following static functions:
|
||||||
|
|
||||||
|
int __gthread_once (__gthread_once_t *once, void (*func) ())
|
||||||
|
|
||||||
|
int __gthread_key_create (__gthread_key_t *keyp, void (*dtor) (void *))
|
||||||
|
int __gthread_key_delete (__gthread_key_t key)
|
||||||
|
|
||||||
|
int __gthread_key_dtor (__gthread_key_t key, void *ptr)
|
||||||
|
|
||||||
|
void *__gthread_getspecific (__gthread_key_t key)
|
||||||
|
int __gthread_setspecific (__gthread_key_t key, const void *ptr)
|
||||||
|
|
||||||
|
int __gthread_mutex_lock (__gthread_mutex_t *mutex);
|
||||||
|
int __gthread_mutex_trylock (__gthread_mutex_t *mutex);
|
||||||
|
int __gthread_mutex_unlock (__gthread_mutex_t *mutex);
|
||||||
|
|
||||||
|
All functions returning int should return 0 on success, -1 on error.
|
||||||
|
|
||||||
|
Currently supported threads packages are
|
||||||
|
POSIX threads with -D_PTHREADS
|
||||||
|
DCE threads with -D_DCE_THREADS
|
||||||
|
Solaris/UI threads with -D_SOLARIS_THREADS
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Check first for thread specific defines. */
|
||||||
|
#if _PTHREADS
|
||||||
|
#include "gthr-posix.h"
|
||||||
|
#elif _DCE_THREADS
|
||||||
|
#include "gthr-dce.h"
|
||||||
|
#elif _SOLARIS_THREADS
|
||||||
|
#include "gthr-solaris.h"
|
||||||
|
|
||||||
|
/* Include GTHREAD_FILE if one is defined. */
|
||||||
|
#elif SUPPORTS_WEAK && HAVE_GTHR_DEFAULT
|
||||||
|
#ifndef GTHREAD_USE_WEAK
|
||||||
|
#define GTHREAD_USE_WEAK 1
|
||||||
|
#endif
|
||||||
|
#include "gthr-default.h"
|
||||||
|
|
||||||
|
/* Fallback to single thread definitions. */
|
||||||
|
#else
|
||||||
|
#include "gthr-single.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* not __gthr_h */
|
321
gcc/libgcc-thr.h
321
gcc/libgcc-thr.h
@ -1,321 +0,0 @@
|
|||||||
/* Threads compatibily routines for libgcc2. */
|
|
||||||
/* Compile this one with gcc. */
|
|
||||||
/* Copyright (C) 1997 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This file is part of GNU CC.
|
|
||||||
|
|
||||||
GNU CC is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
any later version.
|
|
||||||
|
|
||||||
GNU CC 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 General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with GNU CC; see the file COPYING. If not, write to
|
|
||||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA. */
|
|
||||||
|
|
||||||
/* As a special exception, if you link this library with other files,
|
|
||||||
some of which are compiled with GCC, to produce an executable,
|
|
||||||
this library does not by itself cause the resulting executable
|
|
||||||
to be covered by the GNU General Public License.
|
|
||||||
This exception does not however invalidate any other reasons why
|
|
||||||
the executable file might be covered by the GNU General Public License. */
|
|
||||||
|
|
||||||
#ifndef __libgcc_thr_h
|
|
||||||
#define __libgcc_thr_h
|
|
||||||
|
|
||||||
/* If this file is compiled with threads support, it must
|
|
||||||
#define __GTHREADS 1
|
|
||||||
to indicate that threads support is present.
|
|
||||||
|
|
||||||
The threads interface must define the following types:
|
|
||||||
__gthread_key_t
|
|
||||||
__gthread_once_t
|
|
||||||
__gthread_mutex_t
|
|
||||||
|
|
||||||
The threads interface must define the following macros:
|
|
||||||
|
|
||||||
__GTHREAD_ONCE_INIT
|
|
||||||
to initialize __gthread_once_t
|
|
||||||
__GTHREAD_MUTEX_INIT
|
|
||||||
to initialize __gthread_mutex_t to get a fast
|
|
||||||
non-recursive mutex.
|
|
||||||
|
|
||||||
The threads interface must define the following static functions:
|
|
||||||
|
|
||||||
int __gthread_once (__gthread_once_t *once, void (*func) ())
|
|
||||||
|
|
||||||
int __gthread_key_create (__gthread_key_t *keyp, void (*dtor) (void *))
|
|
||||||
int __gthread_key_delete (__gthread_key_t key)
|
|
||||||
|
|
||||||
void *__gthread_getspecific (__gthread_key_t key)
|
|
||||||
int __gthread_setspecific (__gthread_key_t key, const void *ptr)
|
|
||||||
|
|
||||||
int __gthread_mutex_lock (__gthread_mutex_t *mutex);
|
|
||||||
int __gthread_mutex_trylock (__gthread_mutex_t *mutex);
|
|
||||||
int __gthread_mutex_unlock (__gthread_mutex_t *mutex);
|
|
||||||
|
|
||||||
All functions returning int should return 0 on success, -1 on error.
|
|
||||||
|
|
||||||
Currently supported threads packages are
|
|
||||||
POSIX threads with -D_PTHREADS
|
|
||||||
DCE threads with -D_DCE_THREADS
|
|
||||||
Solaris/UI threads with -D_SOLARIS_THREADS
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if _PTHREADS
|
|
||||||
/* POSIX threads specific definitions.
|
|
||||||
Easy, since the interface is just one-to-one mapping. */
|
|
||||||
|
|
||||||
#define __GTHREADS 1
|
|
||||||
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
typedef pthread_key_t __gthread_key_t;
|
|
||||||
typedef pthread_once_t __gthread_once_t;
|
|
||||||
typedef pthread_mutex_t __gthread_mutex_t;
|
|
||||||
|
|
||||||
#define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
|
|
||||||
#define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_once (__gthread_once_t *once, void (*func) ())
|
|
||||||
{
|
|
||||||
return pthread_once (once, func);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_key_create (__gthread_key_t *key, void (*dtor) (void *))
|
|
||||||
{
|
|
||||||
return pthread_key_create (key, dtor);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_key_delete (__gthread_key_t key)
|
|
||||||
{
|
|
||||||
return pthread_key_delete (key);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void *
|
|
||||||
__gthread_getspecific (__gthread_key_t key)
|
|
||||||
{
|
|
||||||
return pthread_getspecific (key);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_setspecific (__gthread_key_t key, const void *ptr)
|
|
||||||
{
|
|
||||||
return pthread_setspecific (key, ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_lock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return pthread_mutex_lock (mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_trylock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return pthread_mutex_trylock (mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_unlock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return pthread_mutex_unlock (mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif _DCE_THREADS
|
|
||||||
/* DCE threads interface.
|
|
||||||
DCE threads are based on POSIX threads draft 4, and many things
|
|
||||||
have changed since then. */
|
|
||||||
|
|
||||||
#define __GTHREADS 1
|
|
||||||
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
typedef pthread_key_t __gthread_key_t;
|
|
||||||
typedef pthread_once_t __gthread_once_t;
|
|
||||||
typedef pthread_mutex_t __gthread_mutex_t;
|
|
||||||
|
|
||||||
#define __GTHREAD_ONCE_INIT pthread_once_init
|
|
||||||
/* Howto define __GTHREAD_MUTEX_INIT? */
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_once (__gthread_once_t *once, void (*func) ())
|
|
||||||
{
|
|
||||||
return pthread_once (once, func);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_key_create (__gthread_key_t *key, void (*dtor) (void *))
|
|
||||||
{
|
|
||||||
return pthread_keycreate (key, dtor);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_key_delete (__gthread_key_t key)
|
|
||||||
{
|
|
||||||
return pthread_key_delete (key);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void *
|
|
||||||
__gthread_getspecific (__gthread_key_t key)
|
|
||||||
{
|
|
||||||
void *ptr;
|
|
||||||
if (pthread_getspecific (key, &ptr) == 0)
|
|
||||||
return ptr;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_setspecific (__gthread_key_t key, const void *ptr)
|
|
||||||
{
|
|
||||||
return pthread_setspecific (key, (void *) ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_lock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return pthread_mutex_lock (mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_trylock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return pthread_mutex_trylock (mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_unlock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return pthread_mutex_unlock (mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif _SOLARIS_THREADS
|
|
||||||
/* Solaris threads as found in Solaris 2.[456].
|
|
||||||
Actually these are Unix International (UI) threads, but I don't
|
|
||||||
know if anyone else implements these. */
|
|
||||||
|
|
||||||
#define __GTHREADS 1
|
|
||||||
|
|
||||||
#include <thread.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
typedef thread_key_t __gthread_key_t;
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
mutex_t mutex;
|
|
||||||
int once;
|
|
||||||
} __gthread_once_t;
|
|
||||||
typedef mutex_t __gthread_mutex_t;
|
|
||||||
|
|
||||||
#define __GTHREAD_ONCE_INIT { DEFAULTMUTEX, 0 }
|
|
||||||
#define __GTHREAD_MUTEX_INIT DEFAULTMUTEX
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_once (__gthread_once_t *once, void (*func) ())
|
|
||||||
{
|
|
||||||
if (once == 0 || func == 0)
|
|
||||||
{
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (once->once == 0)
|
|
||||||
{
|
|
||||||
if (mutex_lock (&once->mutex) != 0)
|
|
||||||
return -1;
|
|
||||||
if (once->once == 0)
|
|
||||||
{
|
|
||||||
(*func) ();
|
|
||||||
once->once ++;
|
|
||||||
}
|
|
||||||
mutex_unlock (&once->mutex);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_key_create (__gthread_key_t *key, void (*dtor) (void *))
|
|
||||||
{
|
|
||||||
return thr_keycreate (key, dtor);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_key_delete (__gthread_key_t key)
|
|
||||||
{
|
|
||||||
/* Not possible. */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void *
|
|
||||||
__gthread_getspecific (__gthread_key_t key)
|
|
||||||
{
|
|
||||||
void *ptr;
|
|
||||||
if (thr_getspecific (key, &ptr) == 0)
|
|
||||||
return ptr;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_setspecific (__gthread_key_t key, const void *ptr)
|
|
||||||
{
|
|
||||||
return thr_setspecific (key, (void *) ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_lock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return mutex_lock (mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_trylock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return mutex_trylock (mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_unlock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return mutex_unlock (mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* no threads */
|
|
||||||
|
|
||||||
/* Just provide compatibility for mutex handling. */
|
|
||||||
|
|
||||||
typedef int __gthread_mutex_t;
|
|
||||||
|
|
||||||
#define __GTHREAD_MUTEX_INIT 0
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_lock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_trylock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
__gthread_mutex_unlock (__gthread_mutex_t *mutex)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* no threads */
|
|
||||||
|
|
||||||
#endif /* not __libgcc_thr_h */
|
|
@ -2965,7 +2965,7 @@ int _exit_dummy_decl = 0; /* prevent compiler & linker warnings */
|
|||||||
|
|
||||||
#ifdef L_eh
|
#ifdef L_eh
|
||||||
|
|
||||||
#include "libgcc-thr.h"
|
#include "gthr.h"
|
||||||
|
|
||||||
/* Shared exception handling support routines. */
|
/* Shared exception handling support routines. */
|
||||||
|
|
||||||
@ -3038,6 +3038,7 @@ static __gthread_key_t eh_context_key;
|
|||||||
static void
|
static void
|
||||||
eh_context_free (void *ptr)
|
eh_context_free (void *ptr)
|
||||||
{
|
{
|
||||||
|
__gthread_key_dtor (eh_context_key, ptr);
|
||||||
if (ptr)
|
if (ptr)
|
||||||
free (ptr);
|
free (ptr);
|
||||||
}
|
}
|
||||||
@ -3094,7 +3095,11 @@ eh_context_initialize ()
|
|||||||
#if __GTHREADS
|
#if __GTHREADS
|
||||||
|
|
||||||
static __gthread_once_t once = __GTHREAD_ONCE_INIT;
|
static __gthread_once_t once = __GTHREAD_ONCE_INIT;
|
||||||
__gthread_once (&once, eh_threads_initialize);
|
if (__gthread_once (&once, eh_threads_initialize) == -1)
|
||||||
|
{
|
||||||
|
/* Use static version of EH context. */
|
||||||
|
get_eh_context = &eh_context_static;
|
||||||
|
}
|
||||||
|
|
||||||
#else /* no __GTHREADS */
|
#else /* no __GTHREADS */
|
||||||
|
|
||||||
|
281
gcc/objc/thr-dce.c
Normal file
281
gcc/objc/thr-dce.c
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
/* GNU Objective C Runtime Thread Interface
|
||||||
|
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
Contributed by Galen C. Hunt (gchunt@cs.rochester.edu)
|
||||||
|
|
||||||
|
This file is part of GNU CC.
|
||||||
|
|
||||||
|
GNU CC is free software; you can redistribute it and/or modify it under the
|
||||||
|
terms of the GNU General Public License as published by the Free Software
|
||||||
|
Foundation; either version 2, or (at your option) any later version.
|
||||||
|
|
||||||
|
GNU CC 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 General Public License for more
|
||||||
|
details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with
|
||||||
|
GNU CC; see the file COPYING. If not, write to the Free Software
|
||||||
|
Foundation, 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, if you link this library with files compiled with
|
||||||
|
GCC to produce an executable, this does not cause the resulting executable
|
||||||
|
to be covered by the GNU General Public License. This exception does not
|
||||||
|
however invalidate any other reasons why the executable file might be
|
||||||
|
covered by the GNU General Public License. */
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <objc/thr.h>
|
||||||
|
#include "runtime.h"
|
||||||
|
|
||||||
|
/* Key structure for maintaining thread specific storage */
|
||||||
|
static pthread_key_t _objc_thread_storage;
|
||||||
|
|
||||||
|
/* Backend initialization functions */
|
||||||
|
|
||||||
|
/* Initialize the threads subsystem. */
|
||||||
|
int
|
||||||
|
__objc_init_thread_system(void)
|
||||||
|
{
|
||||||
|
/* Initialize the thread storage key */
|
||||||
|
return pthread_keycreate(&_objc_thread_storage, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close the threads subsystem. */
|
||||||
|
int
|
||||||
|
__objc_close_thread_system(void)
|
||||||
|
{
|
||||||
|
/* Destroy the thread storage key */
|
||||||
|
/* Not implemented yet */
|
||||||
|
/* return pthread_key_delete(&_objc_thread_storage); */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Backend thread functions */
|
||||||
|
|
||||||
|
/* Create a new thread of execution. */
|
||||||
|
objc_thread_t
|
||||||
|
__objc_thread_detach(void (*func)(void *arg), void *arg)
|
||||||
|
{
|
||||||
|
objc_thread_t thread_id;
|
||||||
|
pthread_t new_thread_handle;
|
||||||
|
|
||||||
|
if (pthread_create(&new_thread_handle, pthread_attr_default,
|
||||||
|
(void *)func, arg) == 0)
|
||||||
|
{
|
||||||
|
/* ??? May not work! (64bit) */
|
||||||
|
thread_id = *(objc_thread_t *)&new_thread_handle;
|
||||||
|
pthread_detach(&new_thread_handle); /* Fully detach thread. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
thread_id = NULL;
|
||||||
|
|
||||||
|
return thread_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the current thread's priority. */
|
||||||
|
int
|
||||||
|
__objc_thread_set_priority(int priority)
|
||||||
|
{
|
||||||
|
int sys_priority = 0;
|
||||||
|
|
||||||
|
switch (priority)
|
||||||
|
{
|
||||||
|
case OBJC_THREAD_INTERACTIVE_PRIORITY:
|
||||||
|
sys_priority = (PRI_FG_MIN_NP + PRI_FG_MAX_NP) / 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case OBJC_THREAD_BACKGROUND_PRIORITY:
|
||||||
|
sys_priority = (PRI_BG_MIN_NP + PRI_BG_MAX_NP) / 2;
|
||||||
|
break;
|
||||||
|
case OBJC_THREAD_LOW_PRIORITY:
|
||||||
|
sys_priority = (PRI_BG_MIN_NP + PRI_BG_MAX_NP) / 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Change the priority. */
|
||||||
|
if (pthread_setprio(pthread_self(), sys_priority) >= 0)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
/* Failed */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the current thread's priority. */
|
||||||
|
int
|
||||||
|
__objc_thread_get_priority(void)
|
||||||
|
{
|
||||||
|
int sys_priority;
|
||||||
|
|
||||||
|
if ((sys_priority = pthread_getprio(pthread_self())) >= 0) {
|
||||||
|
if (sys_priority >= PRI_FG_MIN_NP && sys_priority <= PRI_FG_MAX_NP)
|
||||||
|
return OBJC_THREAD_INTERACTIVE_PRIORITY;
|
||||||
|
if (sys_priority >= PRI_BG_MIN_NP && sys_priority <= PRI_BG_MAX_NP)
|
||||||
|
return OBJC_THREAD_BACKGROUND_PRIORITY;
|
||||||
|
return OBJC_THREAD_LOW_PRIORITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Failed */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Yield our process time to another thread. */
|
||||||
|
void
|
||||||
|
__objc_thread_yield(void)
|
||||||
|
{
|
||||||
|
pthread_yield();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Terminate the current thread. */
|
||||||
|
int
|
||||||
|
__objc_thread_exit(void)
|
||||||
|
{
|
||||||
|
/* exit the thread */
|
||||||
|
pthread_exit(&__objc_thread_exit_status);
|
||||||
|
|
||||||
|
/* Failed if we reached here */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns an integer value which uniquely describes a thread. */
|
||||||
|
objc_thread_t
|
||||||
|
__objc_thread_id(void)
|
||||||
|
{
|
||||||
|
pthread_t self = pthread_self();
|
||||||
|
|
||||||
|
return (objc_thread_t) pthread_getunique_np (&self);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sets the thread's local storage pointer. */
|
||||||
|
int
|
||||||
|
__objc_thread_set_data(void *value)
|
||||||
|
{
|
||||||
|
return pthread_setspecific(_objc_thread_storage, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns the thread's local storage pointer. */
|
||||||
|
void *
|
||||||
|
__objc_thread_get_data(void)
|
||||||
|
{
|
||||||
|
void *value = NULL;
|
||||||
|
|
||||||
|
if ( !(pthread_getspecific(_objc_thread_storage, &value)) )
|
||||||
|
return value;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Backend mutex functions */
|
||||||
|
|
||||||
|
/* Allocate a mutex. */
|
||||||
|
int
|
||||||
|
__objc_mutex_allocate(objc_mutex_t mutex)
|
||||||
|
{
|
||||||
|
if (pthread_mutex_init((pthread_mutex_t *)(&(mutex->backend)),
|
||||||
|
pthread_mutexattr_default))
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Deallocate a mutex. */
|
||||||
|
int
|
||||||
|
__objc_mutex_deallocate(objc_mutex_t mutex)
|
||||||
|
{
|
||||||
|
if (pthread_mutex_destroy((pthread_mutex_t *)(&(mutex->backend))))
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Grab a lock on a mutex. */
|
||||||
|
int
|
||||||
|
__objc_mutex_lock(objc_mutex_t mutex)
|
||||||
|
{
|
||||||
|
return pthread_mutex_lock((pthread_mutex_t *)(&(mutex->backend)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try to grab a lock on a mutex. */
|
||||||
|
int
|
||||||
|
__objc_mutex_trylock(objc_mutex_t mutex)
|
||||||
|
{
|
||||||
|
if (pthread_mutex_trylock((pthread_mutex_t *)(&(mutex->backend))) != 1)
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unlock the mutex */
|
||||||
|
int
|
||||||
|
__objc_mutex_unlock(objc_mutex_t mutex)
|
||||||
|
{
|
||||||
|
return pthread_mutex_unlock((pthread_mutex_t *)(&(mutex->backend)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Backend condition mutex functions */
|
||||||
|
|
||||||
|
/* Allocate a condition. */
|
||||||
|
int
|
||||||
|
__objc_condition_allocate(objc_condition_t condition)
|
||||||
|
{
|
||||||
|
/* Unimplemented. */
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (pthread_cond_init((pthread_cond_t *)(&(condition->backend)), NULL))
|
||||||
|
return -1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Deallocate a condition. */
|
||||||
|
int
|
||||||
|
__objc_condition_deallocate(objc_condition_t condition)
|
||||||
|
{
|
||||||
|
/* Unimplemented. */
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
return pthread_cond_destroy((pthread_cond_t *)(&(condition->backend)));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait on the condition */
|
||||||
|
int
|
||||||
|
__objc_condition_wait(objc_condition_t condition, objc_mutex_t mutex)
|
||||||
|
{
|
||||||
|
/* Unimplemented. */
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
return pthread_cond_wait((pthread_cond_t *)(&(condition->backend)),
|
||||||
|
(pthread_mutex_t *)(&(mutex->backend)));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wake up all threads waiting on this condition. */
|
||||||
|
int
|
||||||
|
__objc_condition_broadcast(objc_condition_t condition)
|
||||||
|
{
|
||||||
|
/* Unimplemented. */
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
return pthread_cond_broadcast((pthread_cond_t *)(&(condition->backend)));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wake up one thread waiting on this condition. */
|
||||||
|
int
|
||||||
|
__objc_condition_signal(objc_condition_t condition)
|
||||||
|
{
|
||||||
|
/* Unimplemented. */
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
return pthread_cond_signal((pthread_cond_t *)(&(condition->backend)));
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/* End of File */
|
Loading…
Reference in New Issue
Block a user