[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00953] Re: ツリーで移動中にSEGV



 しらいです。

In Message-Id <20120311082834.B02094806A6@yuka.unixusers.net>
        Takashi SHIRAI <shirai@unixusers.net>writes:
>  しらいです。

> >  出力の方も時折 block されるので、コマンドプロンプト以外の
> > 端末を使う場合は適宜何かキー入力をして、出力を促してやる必要
> > があります。
> >  多分全然使いものにならないので、標準の cygwin.bat を使って
> > コマンドプロンプト上の bash を起動して下さい。
> 
>  ということで、回避不能な支障はこれのみになりました。けど、
> O_NONBLOCK も効かないので状況はさっぱりです。取り敢えず、次
> の release は 1.7.11 ではなく 1.7.9 対応ということで出します。

 こちらもようやく解決しましたが、多分 Cygwin の bug だと思
います。block していたのは tcflush() でした。
 端末に対し tcflush() を実行した場合、入力が空で出力が多い
場合に tcflush() が EAGAIN で失敗します。EAGAIN なもんで再試
行を続けてたのが block の原因でした。
 これは ioctl() の TCFLSH request を呼出すだけのラッパの筈
なんですが、ioctl() の方は何故か問題なく動きます。tcsetpgrp()
の時と逆パターンですね。
 flush 対象を入力、出力、両方と試してみましたが同じ症状にな
ります。端末の入出力を区別出来ていないのかも知れません。困っ
たものです。

 取り敢えず暫定 patch をつけておきます。この patch では全て
の Cygwin に対して適用していますが、<cygwin/version.h> の中
に version 識別子を見つけたので、これで判別したいと思います。
 cc に渡す -DCYGWIN=1 という option を -DCYGWIN=1007011 の
ように DLL version にしてやることで、わざわざ include するこ
となく判別可能にする予定です。
 今後はこれを使って旧版で動いていた code はそのまま保持する
形にしていければと思っていますが、私自身がそんなに細かいとこ
ろまで追随出来ないので、余り期待はしないでおいて下さい。

---- Cut Here ----
diff -ur ../old/FD-3.00j/termio.h ./termio.h
--- ../old/FD-3.00j/termio.h	Sat Sep 25 00:00:00 2010
+++ ./termio.h	Sun Mar 11 22:27:54 2012
@@ -114,6 +114,11 @@
 #define	FLSHOUT			FWRITE
 #define	FLSHIO			(FREAD | FWRITE)
 #endif	/* !USESGTTY */
+
+#ifdef	CYGWIN
+#undef	ttyflush
+#define	ttyflush(f, a)		Xioctl(f, TCFLSH, (VOID_P)a)
+#endif
 
 #ifdef	TIOCGWINSZ
 typedef struct winsize		termwsize_t;
---- Cut Here ----

                                               しらい たかし