OpenBSD/sgi on octane2 - mutex.cへのスピンロック実装
OpenBSD/sgiのmutex.cは何と単なるスタブだ。
だからちゃんと実装してあげなきゃならない。
Index: ../../sgi/sgi/mutex.c =================================================================== RCS file: /cvs/src/sys/arch/sgi/sgi/mutex.c,v retrieving revision 1.4 diff -r1.4 mutex.c 1c1 < /* $OpenBSD: mutex.c,v 1.4 2009/04/27 21:48:56 kettenis Exp $ */ --- > /* $OpenBSD: mutex.c,v 1.2 2007/05/14 17:32:17 miod Exp $ */ 34,37d33 < #ifdef MULTIPROCESSOR < #error This code needs more work < #endif < 56a53,69 > #ifdef MULTIPROCESSOR > int tmp0, tmp1; > > asm volatile ( > "sync\n" > "1:\n" > "ll %0, %2\n" > "nop\n" > "bnez %0, 1b\n" > "li %1, 1\n" > "sc %1, %2\n" > "beqz %1, 1b\n" > "nop\n" > "sync\n" > : "+r"(tmp0), "+r"(tmp1) > : "m"(mtx->mtx_lock)); > #else 58a72,74 > #endif > > mtx->mtx_owner = curcpu(); 63a80 > 64a82 > 65a84 > 67a87 > mtx->mtx_owner = NULL;
インラインアセンブリを使ってll/scを用いた単純なスピンロックを実装した。
CPUが1つの時はこれで動いているが、複数の時もきちんと動くかは今後確かめていく必要がある。