[zeromq-dev] rc == 0 (./zmq/mutex.hpp:94)

Steven McCoy steven.mccoy at miru.hk
Tue Jul 14 03:56:19 CEST 2009


2009/7/14 Aamir M <aamirjvm at gmail.com>

> You could potentially use
> a PlayStation3 with Linux to do the testing ... PS3 is a relatively
> cheap PowerPC environment, though setting up the build environment
> might be a pain.
>
>
Easier to find an old Mac to use, I have a G3 sitting idle but it's rather
slow.  Of course you can just lift the tried and tested PowerPC assembly
from glibc, noting there appears to be a compiler bug when optimizing:

#if defined (G_ATOMIC_POWERPC)
/* Adapted from CVS version 1.16 of glibc's sysdeps/powerpc/bits/atomic.h
 * and CVS version 1.4 of glibc's sysdeps/powerpc/powerpc32/bits/atomic.h
 * and CVS version 1.7 of glibc's sysdeps/powerpc/powerpc64/bits/atomic.h
 */
# ifdef __OPTIMIZE__
/* Non-optimizing compile bails on the following two asm statements
 * for reasons unknown to the author */
gint
g_atomic_int_exchange_and_add (volatile gint *atomic,
          gint val)
{
  gint result, temp;
  __asm__ __volatile__ ("1: lwarx %0,0,%3\n"
   " add %1,%0,%4\n"
   " stwcx. %1,0,%3\n"
   " bne- 1b"
   : "=&b" (result), "=&r" (temp), "=m" (*atomic)
   : "b" (atomic), "r" (val), "m" (*atomic)
   : "cr0", "memory");
  return result;
}

/* The same as above, to save a function call repeated here */
void
g_atomic_int_add (volatile gint *atomic,
    gint val)
{
  gint result, temp;
  __asm__ __volatile__ ("1: lwarx %0,0,%3\n"
   " add %1,%0,%4\n"
   " stwcx. %1,0,%3\n"
   " bne- 1b"
   : "=&b" (result), "=&r" (temp), "=m" (*atomic)
   : "b" (atomic), "r" (val), "m" (*atomic)
   : "cr0", "memory");
}
# else /* !__OPTIMIZE__ */
gint
g_atomic_int_exchange_and_add (volatile gint *atomic,
          gint val)
{
  gint result;
  do
    result = *atomic;
  while (!g_atomic_int_compare_and_exchange (atomic, result, result + val));

  return result;
}

void
g_atomic_int_add (volatile gint *atomic,
    gint val)
{
  gint result;
  do
    result = *atomic;
  while (!g_atomic_int_compare_and_exchange (atomic, result, result + val));
}
# endif /* !__OPTIMIZE__ */

# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */
gboolean
g_atomic_int_compare_and_exchange (volatile gint *atomic,
       gint oldval,
       gint newval)
{
  gint result;
  __asm__ __volatile__ ("sync\n"
   "1: lwarx %0,0,%1\n"
   " subf. %0,%2,%0\n"
   " bne 2f\n"
   " stwcx. %3,0,%1\n"
   " bne- 1b\n"
   "2: isync"
   : "=&r" (result)
   : "b" (atomic), "r" (oldval), "r" (newval)
   : "cr0", "memory");
  return result == 0;
}

gboolean
g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
           gpointer oldval,
           gpointer newval)
{
  gpointer result;
  __asm__ __volatile__ ("sync\n"
   "1: lwarx %0,0,%1\n"
   " subf. %0,%2,%0\n"
   " bne 2f\n"
   " stwcx. %3,0,%1\n"
   " bne- 1b\n"
   "2: isync"
   : "=&r" (result)
   : "b" (atomic), "r" (oldval), "r" (newval)
   : "cr0", "memory");
  return result == 0;
}
# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */
gboolean
g_atomic_int_compare_and_exchange (volatile gint *atomic,
       gint oldval,
       gint newval)
{
  gpointer result;
  __asm__ __volatile__ ("sync\n"
   "1: lwarx %0,0,%1\n"
   " extsw %0,%0\n"
   " subf. %0,%2,%0\n"
   " bne 2f\n"
   " stwcx. %3,0,%1\n"
   " bne- 1b\n"
   "2: isync"
   : "=&r" (result)
   : "b" (atomic), "r" (oldval), "r" (newval)
   : "cr0", "memory");
  return result == 0;
}

gboolean
g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
           gpointer oldval,
           gpointer newval)
{
  gpointer result;
  __asm__ __volatile__ ("sync\n"
   "1: ldarx %0,0,%1\n"
   " subf. %0,%2,%0\n"
   " bne 2f\n"
   " stdcx. %3,0,%1\n"
   " bne- 1b\n"
   "2: isync"
   : "=&r" (result)
   : "b" (atomic), "r" (oldval), "r" (newval)
   : "cr0", "memory");
  return result == 0;
}
# else /* What's that */
# error "Your system has an unsupported pointer size"
# endif /* GLIB_SIZEOF_VOID_P */

-- 
Steve-o
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20090714/942ad74b/attachment.htm>


More information about the zeromq-dev mailing list