[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00953] Re: ツリーで移動中にSEGV
- Subject: [FDclone-users:00953] Re: ツリーで移動中にSEGV
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Sun, 11 Mar 2012 22:58:17 +0900
しらいです。
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 ----
しらい たかし