From 754d1a92e65d7a8fdfdc36e2b72e8abfdcf70f5b Mon Sep 17 00:00:00 2001 From: Teemu Torma Date: Wed, 11 Mar 1998 12:07:25 +0000 Subject: [PATCH] Patch from Teemu Torma to fix Solaris 2.6 EH failures. * gthr.h: Changed the comment about return values. * gthr-solaris.h (__gthread_once): Do not use errno; return the error number instead of -1. (__gthread_key_create): Any non-zero return value is an error. * libgcc2.c (eh_context_initialize): Check for non-zero return value from __gthread_once. Check that the value of get_eh_context was really changed. From-SVN: r18480 --- gcc/ChangeLog | 10 ++++++++++ gcc/gthr-solaris.h | 12 +++++------- gcc/gthr.h | 3 ++- gcc/libgcc2.c | 6 +++++- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6e9438d8a7d..cb234fce105 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +Wed Mar 11 12:05:20 1998 Teemu Torma + + * gthr.h: Changed the comment about return values. + * gthr-solaris.h (__gthread_once): Do not use errno; return the + error number instead of -1. + (__gthread_key_create): Any non-zero return value is an error. + * libgcc2.c (eh_context_initialize): Check for non-zero return + value from __gthread_once. + Check that the value of get_eh_context was really changed. + Wed Mar 11 18:26:25 1998 J"orn Rennecke * sh.h (LOOP_ALIGN): Only align when optimizing. diff --git a/gcc/gthr-solaris.h b/gcc/gthr-solaris.h index 465ececb139..a6f669c2e09 100644 --- a/gcc/gthr-solaris.h +++ b/gcc/gthr-solaris.h @@ -88,15 +88,13 @@ __gthread_once (__gthread_once_t *once, void (*func) ()) return -1; if (once == 0 || func == 0) - { - errno = EINVAL; - return -1; - } + return EINVAL; if (once->once == 0) { - if (mutex_lock (&once->mutex) != 0) - return -1; + int status = mutex_lock (&once->mutex); + if (status != 0) + return status; if (once->once == 0) { (*func) (); @@ -113,7 +111,7 @@ __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) + if (thr_keycreate (key, dtor) != 0 || *key == -1) return -1; else return 0; diff --git a/gcc/gthr.h b/gcc/gthr.h index 54ad6b04c8d..9c5365426bf 100644 --- a/gcc/gthr.h +++ b/gcc/gthr.h @@ -65,7 +65,8 @@ Boston, MA 02111-1307, USA. */ 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. + All functions returning int should return zero on success or the error + number. If the operation is not supported, -1 is returned. Currently supported threads packages are POSIX threads with -D_PTHREADS diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c index e5ad42089e4..f1032a58239 100644 --- a/gcc/libgcc2.c +++ b/gcc/libgcc2.c @@ -3132,7 +3132,11 @@ eh_context_initialize () #if __GTHREADS static __gthread_once_t once = __GTHREAD_ONCE_INIT; - if (__gthread_once (&once, eh_threads_initialize) == -1) + /* Make sure that get_eh_context does not point to us anymore. + Some systems have dummy thread routines in their libc that + return a success (Solaris 2.6 for example). */ + if (__gthread_once (&once, eh_threads_initialize) != 0 + || get_eh_context == &eh_context_initialize) { /* Use static version of EH context. */ get_eh_context = &eh_context_static;