最新版をSolaris10でコンパイルしてみたです。
いつの間にかSunOSの定義でごにょごにょと分岐が追加されていました!ありがとうmikioさん!(もしかしてこのBLOG見てるのかな(*´∀`))
これでSolaris10でもすんなりビルドが・・・通りませんでした(´・ω・)
堅牢なOSなのは認めるし最近のコンテナやZFS、Dtraceはすばらしい技術だと思うけど、正直なところビルドくらい何も考えないで通って欲しい。。゚(゚´Д`゚)゚。 お願いしますよ。Sunマイクロシステムズ様。
で、やっぱりrealpath関係で怒られました。
Solaris10でrealpathが使えるようになるには、以下の条件を満たす必要があるみたいです。
#if defined(__EXTENSIONS__) || \ (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \ defined(_XPG4_2)
std=c99をつけると、 __STRICT_ANSI__マクロが定義されます。
/usr/include/sys/feature_tests.hをひもといていくと、_STRICT_STDCが定義されるので上記の条件(の2行目のやつ)を満たさなくなってしまうようです。ここ(manpage)を見ると色々書いてあります。
これを回避するには以下の2つの方法があります。(正確にはもっとありますけど、試していません)
- __EXTENSIONS__を定義する
- std=c99をstd=gnu99にする
どれくらい影響範囲があるのか分からないので自己責任で好きな方を選択すれば良いと思います。
前者の場合は、以下のようにconfigureで指定します。
./configure CFLAGS="-D__EXTENSIONS__"
後者の場合は、configureとconfigure.inに記述されている内容を置換します。(configureした後にMakefileを修正しても良いですけど)
perl -i -p -e "s/c99/gnu99/g;" configure*
あとは普通にビルドをします。
gmake >/dev/null tcutil.c:7401: 警告: 初期化子のまわりのブレースを欠いています tcutil.c:7401: 警告: (`tcglobalmutexonce.__pthread_once_pad' の初期化は不完全です) tcutil.c: In function `tcbwtdecode': tcutil.c:7717: 警告: statement with no effect tcutil.c: In function `tcbwtencode': tcutil.c:7677: 警告: statement with no effect ar: creating libtokyocabinet.a
出ている警告は全て動作に対して影響はありません。最初の2個の警告は前回の記事に回避策が書いてあります。(でも、わざわざ修正するような内容ではありません(*・ε・*))
ちなみにマクロの定義一覧を出したい場合は以下のような感じで出せます(2個ほどマクロ定義してあるのはTokyo Cabinetビルドしたらこのマクロももれなくついてきたので。)。実際のソースに対してやると何千行も出てきてしまいますが、以下の場合はその環境で最低限定義されるものが出てきます。(100行もないはずです)
gcc -std=gnu99 -D_GNU_SOURCE=1 -D_REENTRANT -E -dM -x c /dev/null
ちょっと気になった点について。
1.4.2,3,4辺りでpthread_yield()の実装が毎回変更されていて今はusleepになっていますが、これってやっぱりusleepのが速いからなんでしょうか。Solaris10の場合、sched_yieldの実装はシステムコールのthr_yieldになっていて、これがスレッドセーフだから遅いのと、yieldすると必要ない場合でもコンテキストスイッチが走るから・・・なのかにゃ(´・ω・)
mikio
ちょろっと前から読まさせていただいてます。
__EXTENSION__つけるのは手軽でよいですね。
pthread_yield(sched_yield)はオマジナイとテストのために呼んでいるだけで、性能に関係するところでは呼ばれません。オマジナイとは、例えばDBの最適化などの重い処理をする前に他のスレッドの処理を先に通してしまいたいといった、何となくな用途です。
タムタム
おお、本人からコメントがいただけるとは。解説ありがとうございます。ヽ( `・ω・´)ノ
一応補足を、、
__EXTENSION__つけた時に他のマクロがundefされないか等の詳細が追えていないのでどれほど影響があるのか怖いところではあります。
ちなみに、yieldってそれを提供しているライブラリ内で動作を保証できていないツンデレ関数なイメージがあります(´∩ω∩`)
そして誕生日おめでとうございます。