シングルトン実装
ああ、なんでわざわざ劣化コピーみたいなタイトルつけるかなぁと自分にツッコミをいれつつ。
id:shinichiro_h:20060817#1155781747 に心動かされたので、眠ることも出来ないのでちょっと遊んでみる。
素人考えでマクロ化してみると、こんな感じか。
GCCのバージョンって事前定義マクロになかったっけか?
あと、後者はPOSIXとか使った方がよさげ。
#if defined(__i386__) || \ defined(__alpha__) || \ defined(__ia64__) || \ defined(__rs6000__) || \ defined(__s390__) || defined(__s390x__) #define EXIT_NOT_FIRST() \ { \ static volatile int flag__value; \ if (1 == __sync_val_compare_and_swap(&flag__value, 0, 1)) \ return; \ } #else #define EXIT_NOT_FIRST() \ { \ static volatile int flag__value; \ if (1 == flag__value) \ return; \ flag__value = 1; \ } #endif
あ、ちなみに __builtin プレフィクスがついてないのは Itanium の ABI にあわせるためとか書いてありました。
というのはgccの4.0.x系のgcc/config/ia64/ia64intrin.hに既に__sync_val_compare_and_swapが定義されているからみたいですな。なるぅ。