Commit 24a40b35 by Nathan Sidwell Committed by Nathan Sidwell

gthr-vxworks.h (struct __gthread_once_t): Add alignment and padding for PPC.

	* gthr-vxworks.h (struct __gthread_once_t): Add alignment and
	padding for PPC.
	(__GTHREAD_ONCE_INIT): Adjust ppc initializer.
	* config/vxlib.c (__gthread_once): Add race guard for PPC.

From-SVN: r146566
parent aa903780
2009-04-22 Nathan Sidwell <nathan@codesourcery.com>
* gthr-vxworks.h (struct __gthread_once_t): Add alignment and
padding for PPC.
(__GTHREAD_ONCE_INIT): Adjust ppc initializer.
* config/vxlib.c (__gthread_once): Add race guard for PPC.
2009-04-22 Paolo Bonzini <bonzini@gnu.org>
* config/sh/sh.c (shift_insns_rtx, shiftcosts, gen_shifty_op,
......
......@@ -65,7 +65,15 @@ __gthread_once (__gthread_once_t *guard, void (*func)(void))
__gthread_lock_library ();
#else
while (!vxTas ((void *)&guard->busy))
taskDelay (1);
{
#ifdef __PPC__
/* This can happen on powerpc, which is using all 32 bits
of the gthread_once_t structure. */
if (guard->done)
return;
#endif
taskDelay (1);
}
#endif
/* Only one thread at a time gets here. Check ->done again, then
......
......@@ -115,17 +115,32 @@ __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex)
typedef struct
{
#ifndef __RTP__
#if !defined(__RTP__)
#if defined(__PPC__)
__attribute ((aligned (__alignof (unsigned))))
#endif
volatile unsigned char busy;
#endif
volatile unsigned char done;
#if !defined(__RTP__) && defined(__PPC__)
/* PPC's test-and-set implementation requires a 4 byte aligned
object, of which it only sets the first byte. We use padding
here, in order to maintain some amount of backwards
compatibility. Without this padding, gthread_once objects worked
by accident because they happen to be static objects and the ppc
port automatically increased their alignment to 4 bytes. */
unsigned char pad1;
unsigned char pad2;
#endif
}
__gthread_once_t;
#ifndef __RTP__
# define __GTHREAD_ONCE_INIT { 0, 0 }
#else
#if defined (__RTP__)
# define __GTHREAD_ONCE_INIT { 0 }
#elif defined (__PPC__)
# define __GTHREAD_ONCE_INIT { 0, 0, 0, 0 }
#else
# define __GTHREAD_ONCE_INIT { 0, 0 }
#endif
extern int __gthread_once (__gthread_once_t *__once, void (*__func)(void));
......
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