Martin Pitt wrote:
> Hi Aurelien!
>
> Aurelien Jarno [2005-08-18 0:36 +0200]:
> > As I am only a Debian developer with a mips machine, I can't install
> > those packages. However, I have found the problem from postgresql-7.4.
> > You will find attached a patch to fix it. Basically the problems comes
> > from the -funit-at-a-time option which is now enabled by default by gcc
> > with the -O2 option. Here is a part of the manpage:
>
> Argh, tricky. Thanks a lot for finding that out!
>
> > My patch fixes that by passing the -fno-unit-at-a-time option when
> > building s_lock.c. A proper fix would be to write inline code that will
> > go to s_lock.h, but I don't have enough knowledge in the mips assembly
> > to write such a code.
>
> That patch is already much better than my gcc 3.3 workaround, so I'll
> apply it in the next upload. Now that we know the source of the problem,
> I'll prod upstream about it.
The appended patch seems to work for 7.4.8.
> > For postgresql-8.0, I suppose the problem is the same, I'll have a look
> > tomorrow.
>
> Certainly, the locking code didn't change significantly.
Then I guess it's also ok for 8.0.
Thiemo
--- postgresql-7.4.8/src/include/storage/s_lock.h.old 2005-08-18 09:08:06.000000000 +0200
+++ postgresql-7.4.8/src/include/storage/s_lock.h 2005-08-18 09:21:25.000000000 +0200
@@ -361,6 +361,33 @@ tas(volatile slock_t *lock)
#endif /* NEED_NS32K_TAS_ASM */
+#if defined(__mips__) && defined(__linux__)
+#define TAS(lock) tas(lock)
+
+static __inline__ int
+tas(volatile slock_t *lock)
+{
+ register volatile slock_t *__l = lock;
+ register int __r;
+
+ __asm__ __volatile__(
+ " .set push \n"
+ " .set mips2 \n"
+ " .set noreorder \n"
+ " .set nomacro \n"
+ "1: ll %0, %1 \n"
+ " bne %0, $0, 1f \n"
+ " xori %0, 1 \n"
+ " sc %0, %1 \n"
+ " beq %0, $0, 1b \n"
+ " sync \n"
+ "1: .set pop "
+ : "=&r" (__r), "+R" (*__l));
+ return __r;
+}
+
+#endif /* mips */
+
#else /* !__GNUC__ */
--- postgresql-7.4.8/src/backend/storage/lmgr/s_lock.c.old 2003-08-08 23:42:00.000000000 +0200
+++ postgresql-7.4.8/src/backend/storage/lmgr/s_lock.c 2005-08-18 09:21:09.000000000 +0200
@@ -148,7 +148,7 @@ _success: \n\
}
#endif /* __m68k__ */
-#if defined(__mips__) && !defined(__sgi)
+#if defined(__mips__) && !defined(__sgi) && !defined(__linux__)
static void
tas_dummy()
{
Attachment:
signature.asc
Description: Digital signature