toge's diary

コンピュータ関連の趣味をつらつらと。

シングルトン実装

ああ、なんでわざわざ劣化コピーみたいなタイトルつけるかなぁと自分にツッコミをいれつつ。
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が定義されているからみたいですな。なるぅ。