Commit 7ed5d5b2 by Eric Botcazou Committed by Eric Botcazou

gthr-solaris.h (__gthread_recursive_mutex_t): New type.

	* gthr-solaris.h (__gthread_recursive_mutex_t): New type.
	(__GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION): Define to
	__gthread_recursive_mutex_init_function.
	(__gthread_key_create): Properly cast -1.
	(__gthread_recursive_mutex_init_function): New function.
	(__gthread_recursive_mutex_lock): Rewrite.
	(__gthread_recursive_mutex_trylock): Likewise.
	(__gthread_recursive_mutex_unlock): Likewise.

From-SVN: r91086
parent e2e9b7b8
2004-11-23 Eric Botcazou <ebotcazou@libertysurf.fr>
* gthr-solaris.h (__gthread_recursive_mutex_t): New type.
(__GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION): Define to
__gthread_recursive_mutex_init_function.
(__gthread_key_create): Properly cast -1.
(__gthread_recursive_mutex_init_function): New function.
(__gthread_recursive_mutex_lock): Rewrite.
(__gthread_recursive_mutex_trylock): Likewise.
(__gthread_recursive_mutex_unlock): Likewise.
2004-11-23 Ralf Corsepius <ralf.corsepius@rtems.org> 2004-11-23 Ralf Corsepius <ralf.corsepius@rtems.org>
* config/c4x/t-rtems: New. * config/c4x/t-rtems: New.
......
...@@ -44,11 +44,16 @@ typedef struct { ...@@ -44,11 +44,16 @@ typedef struct {
int once; int once;
} __gthread_once_t; } __gthread_once_t;
typedef mutex_t __gthread_mutex_t; typedef mutex_t __gthread_mutex_t;
typedef mutex_t __gthread_recursive_mutex_t;
typedef struct {
long depth;
thread_t owner;
mutex_t actual;
} __gthread_recursive_mutex_t;
#define __GTHREAD_ONCE_INIT { DEFAULTMUTEX, 0 } #define __GTHREAD_ONCE_INIT { DEFAULTMUTEX, 0 }
#define __GTHREAD_MUTEX_INIT DEFAULTMUTEX #define __GTHREAD_MUTEX_INIT DEFAULTMUTEX
#define __GTHREAD_RECURSIVE_MUTEX_INIT RECURSIVE_ERRORCHECKMUTEX #define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function
#if SUPPORTS_WEAK && GTHREAD_USE_WEAK #if SUPPORTS_WEAK && GTHREAD_USE_WEAK
...@@ -411,8 +416,8 @@ __gthread_key_create (__gthread_key_t *key, void (*dtor) (void *)) ...@@ -411,8 +416,8 @@ __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 = (__gthread_key_t)-1;
if (thr_keycreate (key, dtor) != 0 || *key == -1) if (thr_keycreate (key, dtor) != 0 || *key == (__gthread_key_t)-1)
return -1; return -1;
else else
return 0; return 0;
...@@ -469,21 +474,62 @@ __gthread_mutex_unlock (__gthread_mutex_t *mutex) ...@@ -469,21 +474,62 @@ __gthread_mutex_unlock (__gthread_mutex_t *mutex)
} }
static inline int static inline int
__gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *mutex)
{
mutex->depth = 0;
mutex->owner = (thread_t) 0;
return mutex_init (&mutex->actual, USYNC_THREAD, NULL);
}
static inline int
__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex) __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex)
{ {
return __gthread_mutex_lock (mutex); if (__gthread_active_p ())
{
thread_t me = thr_self ();
if (mutex->owner != me)
{
mutex_lock (&mutex->actual);
mutex->owner = me;
}
mutex->depth++;
}
return 0;
} }
static inline int static inline int
__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex) __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex)
{ {
return __gthread_mutex_trylock (mutex); if (__gthread_active_p ())
{
thread_t me = thr_self ();
if (mutex->owner != me)
{
if (mutex_trylock (&mutex->actual))
return 1;
mutex->owner = me;
}
mutex->depth++;
}
return 0;
} }
static inline int static inline int
__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex) __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex)
{ {
return __gthread_mutex_unlock (mutex); if (__gthread_active_p ())
{
if (--mutex->depth == 0)
{
mutex->owner = (thread_t) 0;
mutex_unlock (&mutex->actual);
}
}
return 0;
} }
#endif /* _LIBOBJC */ #endif /* _LIBOBJC */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment