Cygwin vs Fiber

そもそもCygwinではFiberが動かないようです。
http://www.cygwin.com/ml/cygwin/2004-12/msg00085.html
MLの投稿にレスも付いてませんし、このコードは今のバージョンでも動きません。


いろいろ試した結果、ファイバ関数の中でCRT関数を呼ばない限り落ちないことが分かりました。
CRT関数の呼び出し箇所をgdbで覗いてみると、スレッド固有領域(TSS/TLS)へのアクセスで落ちています。
このTLSへのアクセスはマクロ_REENTを介して行われています。マクロを展開すると、

_REENT
→ __getreent()
→ (&_my_tls.local_clib)
→ (&(*((_cygtls *) (_tlsbase - CYGTLS_PADSIZE))).local_clib)
→ (&(*((_cygtls *) (_tlsbase - 12700))).local_clib)

となります。また、

extern char *_tlsbase __asm__ ("%fs:4");

で、ここにはスタックのベースアドレスが入っているようです。
ファイバ切り替えのタイミングで_cygtlsをコピーしてやれば動きそうですが、どこまでコピーしてよいのやら。ちなみに、sizeof(_cygtls) == 4212 でした。


最近はC++よりアセンブリを眺めてるほうが多い気がします、、、。