Hi,
The reason for this failure is a difference
in alignment of long long for MIPS ISA and IA32.
This results that size of gu_rse structure on mips is 24,
instead of expected 20 (on ia32).
As long long is first attribute in structure,
so it is safe to use pack(4).
struct gu_rse
{
long long time;
const void* heap_ptr;
const void* stack_ptr;
longpid;
};
I assume that this fix could be used for other architectures like:
armel, armhf, powerpc, sparc.
I did not have a chance to test it on those architectures,
so my changes affects only mips and mipsel.
Solving this issue, fallowing error appears:
gcs/src/gcs.c:1161: undefined reference to `__sync_fetch_and_add_8'
Mips platform does not have 64-bit __sync_* operations.
To avoid this behaviuor it is needed to use
corresponding __atomic_* from libatomic library.
Patch that solves both issues for mips/mipsel is attached.
Could you please consider including this patch?
Best Regards,
Dejan
diff -uNr percona-xtradb-cluster-galera-2.x-175.orig/SConstruct percona-xtradb-cluster-galera-2.x-175/SConstruct
--- percona-xtradb-cluster-galera-2.x-175.orig/SConstruct 2014-08-13 12:17:02.0 +
+++ percona-xtradb-cluster-galera-2.x-175/SConstruct 2014-08-13 17:07:21.0 +
@@ -368,7 +368,7 @@
print 'Not using boost'
# Check to see if -latomic is need for GCC atomic built-ins.
-if conf.CheckLib(library='atomic', symbol='__sync_fetch_and_add_8'):
+if conf.CheckLib(library='atomic', symbol='__sync_fetch_and_add_8') or conf.CheckLib(library='atomic', symbol='__atomic_fetch_add_8'):
conf.env.Append(LIBS=['atomic'])
# asio
diff -uNr percona-xtradb-cluster-galera-2.x-175.orig/galerautils/src/gu_atomic.h percona-xtradb-cluster-galera-2.x-175/galerautils/src/gu_atomic.h
--- percona-xtradb-cluster-galera-2.x-175.orig/galerautils/src/gu_atomic.h 2014-05-08 01:08:52.0 +
+++ percona-xtradb-cluster-galera-2.x-175/galerautils/src/gu_atomic.h 2014-08-13 17:07:46.0 +
@@ -11,6 +11,8 @@
#ifdef __GNUC__
+#if !defined(__mips__) || defined(__mips64)
+
#define gu_sync_fetch_and_add __sync_fetch_and_add
#define gu_sync_fetch_and_sub __sync_fetch_and_sub
#define gu_sync_fetch_and_or __sync_fetch_and_or
@@ -26,6 +28,28 @@
#define gu_sync_xor_and_fetch __sync_xor_and_fetch
#define gu_sync_nand_and_fetch __gu_sync_nand_and_fetch
+#else /* __mips__ */
+
+/* Mips platform does not have 64-bit __sync_* operations.
+ * so it is needed to use corresponding __atomic_* operations from libatomic library. */
+
+#define gu_sync_fetch_and_add(value_, x) __atomic_fetch_add(value_, x, __ATOMIC_SEQ_CST)
+#define gu_sync_fetch_and_sub(value_, x) __atomic_fetch_sub(value_, x, __ATOMIC_SEQ_CST)
+#define gu_sync_fetch_and_or(value_, x) __atomic_fetch_or(value_, x, __ATOMIC_SEQ_CST)
+#define gu_sync_fetch_and_and(value_, x) __atomic_fetch_and(value_, x, __ATOMIC_SEQ_CST)
+#define gu_sync_fetch_and_xor(value_, x) __atomic_fetch_xor(value_, x, __ATOMIC_SEQ_CST)
+#define gu_sync_fetch_and_nand(value_, x) __atomic_fetch_nand(value_, x, __ATOMIC_SEQ_CST)
+
+
+#define gu_sync_add_and_fetch(value_, x) __atomic_add_fetch(value_, x, __ATOMIC_SEQ_CST)
+#define gu_sync_sub_and_fetch(value_, x) __atomic_sub_fetch(value_, x, __ATOMIC_SEQ_CST)
+#define gu_sync_or_and_fetch(value_, x) __atomic_or_fetch(value_, x, __ATOMIC_SEQ_CST)
+#define gu_sync_and_and_fetch(value_, x) __atomic_and_fetch(value_, x, __ATOMIC_SEQ_CST)
+#define gu_sync_xor_and_fetch(value_, x) __atomic_xor_fetch(value_, x, __ATOMIC_SEQ_CST)
+#define gu_sync_nand_and_fetch(value_, x) __atomic_nand_fetch(value_, x, __ATOMIC_SEQ_CST)
+
+#endif
+
#else /* __GNUC__ */
#error Compiler not supported
#endif
diff -uNr percona-xtradb-cluster-galera-2.x-175.orig/galerautils/src/gu_rand.c percona-xtradb-cluster-galera-2.x-175/galerautils/src/gu_rand.c
--- percona-xtradb-cluster-galera-2.x-175.orig/galerautils/src/gu_rand.c 2014-05-08 01:08:52.0 +
+++ percona-xtradb-cluster-galera-2.x-175/galerautils/src/gu_rand.c 2014-08-13 17:07:25.0 +
@@ -16,6 +16,16 @@
/*! Structure to hold entropy data.
* Should be at least 20 bytes on 32-bit systems and 28 bytes on 64-bit */
+
+/* Unlike ia32, aligment of long long for MIPS ISA is 8, and size of gu_rse is 24.
+ * As long long atribute is first in gu_rse structure there is no harm in use pack(4) to avoid
+ * undexpected behavior while using gu_rse structure. */
+
+#if defined(__mips__) !defined(__mips64__)
+#pragma pack(push)
+#pragma pack(4)
+#endif
+
struct gu_rse
{
long long time;
@@ -24,6 +34,10 @@
longpid;
};
+#if defined(__mips__) !defined(__mips64__)
+#pragma pack(pop)
+#endif
+
typedef struct gu_rse gu_rse_t;
long int