トップ «前の日記(2007年01月15日) 最新 次の日記(2007年01月19日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2007年01月16日

debian etch sh3/sh4

postgresqlビルド。TAS(TestAndSet)が無いと怒られる。TASはセマフォの基本だ。
distcc sh4-linux-gnu-gcc -g -Wall -O2 -fPIC -Wall -Wmissing-prototypes
 -Wpointer-arith -Winline -Wdeclaration-after-statement -Wendif-labels
 -fno-strict-aliasing -g -I../../../../src/include -D_GNU_SOURCE  -I/u
sr/include/tcl8.4  -c -o xlog.o xlog.c
In file included from ../../../../src/include/storage/spin.h:60,
                 from xlog.c:44:
../../../../src/include/storage/s_lock.h:806:2: error: #error PostgreSQ
L does not have native spinlock support on this platform. To continue t
he compilation, rerun configure using --disable-spinlocks. However, per
formance will be poor. Please report this to pgsql-bugs@postgresql.org.
distcc[1468] ERROR: compile xlog.c on iroiro failed
--disable-spinlocks を付けたらよいけどパフォーマンスは犠牲になるらしい。それは嫌だな。パッチを作ってみる。
 *      int TAS(slock_t *lock)
 *              Atomic test-and-set instruction.  Attempt to acquire the lock,
 *              but do *not* wait.      Returns 0 if successful, nonzero if unable
 *              to acquire the lock.
えーと、lock取れたら0、失敗したら1を返す事と。
--- src/include/storage/s_lock.h-orig   2007-01-16 16:12:32.000000000 +0900
+++ src/include/storage/s_lock.h        2007-01-16 17:55:54.000000000 +0900
@@ -398,6 +398,32 @@
 
 #endif  /* (__mc68000__ || __m68k__) && __linux__ */
 
+#if defined(__SH3__) || defined(__SH4__)
+
+#define HAS_TEST_AND_SET
+
+typedef unsigned char slock_t;
+
+#define TAS(lock) tas(lock)
+
+static __inline__ int
+tas(volatile slock_t *lock)
+{
+register int    _res;
+       __asm__ __volatile__ (
+               "mov #0,%0\n\t"
+               "tas.b %1\n\t"
+               "bt/s 1f\n\t"
+               " nop\n\t"
+               "mov #1,%0\n\t"
+               "1:"
+       : "=r"(_res), "+m"(*lock)
+       : "r" (lock)
+       );
+       return _res;
+}
+
+#endif   /* (__SH3__) || (__SH4__) */
 
 #if defined(__vax__)
 /*
はっきり言って自信ないです(*_*)。間違っていたら誰か指摘してください。mutexが間違っているデータベースなんて使いたくないですよね(^o^A;;)

debian etch sh3/sh4

gccで定義済みのシンボルを表示する
 $ cpp -dM /dev/null
最初 __sh4__ が defineされてなくて困っていたら大文字だった。