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
This commit is contained in:
Teemu Torma 1998-03-11 12:07:25 +00:00 committed by Jim Wilson
parent ffacfc7cb6
commit 754d1a92e6
4 changed files with 22 additions and 9 deletions

View File

@ -1,3 +1,13 @@
Wed Mar 11 12:05:20 1998 Teemu Torma <tot@trema.com>
* 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 <amylaar@cygnus.co.uk> Wed Mar 11 18:26:25 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
* sh.h (LOOP_ALIGN): Only align when optimizing. * sh.h (LOOP_ALIGN): Only align when optimizing.

View File

@ -88,15 +88,13 @@ __gthread_once (__gthread_once_t *once, void (*func) ())
return -1; return -1;
if (once == 0 || func == 0) if (once == 0 || func == 0)
{ return EINVAL;
errno = EINVAL;
return -1;
}
if (once->once == 0) if (once->once == 0)
{ {
if (mutex_lock (&once->mutex) != 0) int status = mutex_lock (&once->mutex);
return -1; if (status != 0)
return status;
if (once->once == 0) if (once->once == 0)
{ {
(*func) (); (*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 /* Solaris 2.5 contains thr_* routines no-op in libc, so test if we actually
got a reasonable key value, and if not, fail. */ got a reasonable key value, and if not, fail. */
*key = -1; *key = -1;
if (thr_keycreate (key, dtor) == -1 || *key == -1) if (thr_keycreate (key, dtor) != 0 || *key == -1)
return -1; return -1;
else else
return 0; return 0;

View File

@ -65,7 +65,8 @@ Boston, MA 02111-1307, USA. */
int __gthread_mutex_trylock (__gthread_mutex_t *mutex); int __gthread_mutex_trylock (__gthread_mutex_t *mutex);
int __gthread_mutex_unlock (__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 Currently supported threads packages are
POSIX threads with -D_PTHREADS POSIX threads with -D_PTHREADS

View File

@ -3132,7 +3132,11 @@ eh_context_initialize ()
#if __GTHREADS #if __GTHREADS
static __gthread_once_t once = __GTHREAD_ONCE_INIT; 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. */ /* Use static version of EH context. */
get_eh_context = &eh_context_static; get_eh_context = &eh_context_static;