[Mew-dist 13883] Using PTY for mewls (was Re: b54)
KOIE Hidetaka ( 鯉江英隆 )
hide at example.com
2000年 8月 19日 (土) 18:38:10 JST
From: Kazu Yamamoto (山本和彦) <kazu at example.com>
Subject: [Mew-dist 13879] Re: b54
Date: Sat, 19 Aug 2000 01:56:19 +0900
| > stdioはファイル記述子がttyかどうかでバッファリングの方針を変える
| > ものもあるようなので、mewlsの方でsetvbuf()をつかって明示的にラインバッ
| > ファリングするように設定すれば、なめらかな出力になると思います。
これは脊髄反射でした。すみません。
| setvbuf() を使い、fully buffered にして、fflush() のみでフラッシュする
| ようにしましたが、やはり pipe と組み合わせると動きがぎこちなくなりまし
| た。
こちらの環境[Pentium 233MHz; FreeBSD-3.3]で
mew-summary-scan-body()の
(let ((process-connection-type mew-connection-type2) ...
をtype1に戻したりして比べてみましたが
pipeとptyとの違いは体感できませんでした。
なぜptyだと滑らかになるのか理解できてませんが
(Emacsかカーネルにそういう仕組があるんでしょうか?)
なんとなくmewlsとmewとの間でフロー制御するようなパッチを作りました。
mewls -xで実行するとstdinにNLが来るのを待ちます。
diff -rpu mew-1.95b54/bin/mewls.c mew-1.95b54.koie/bin/mewls.c
--- mew-1.95b54/bin/mewls.c Tue Aug 1 20:45:46 2000
+++ mew-1.95b54.koie/bin/mewls.c Sat Aug 19 18:34:43 2000
@@ -51,6 +51,8 @@ char *DUMP_FIELD = NULL;
int First = 0, Last = 0;
int use_stat = 1;
+int handshake = 0;
+int n_pending_ack = 0;
char *
expandfolder(char *fld) {
@@ -223,6 +225,22 @@ static int intcompare(int *i, int *j) {
return 0;
}
+void
+wait_ack(int lowt)
+{
+ int ch;
+ while (n_pending_ack > lowt) {
+ while (!ferror(stdin)) {
+ if ((ch = getchar() == '\n') || feof(stdin)) {
+ n_pending_ack--;
+ break;
+ }
+ }
+ if (ferror(stdin))
+ break;
+ }
+}
+
#define SIZE 128
void
scanfolder(char *fld) {
@@ -287,6 +305,11 @@ scanfolder(char *fld) {
else
dumpheader(fp, fnbuf);
fclose(fp);
+
+ if (handshake) {
+ n_pending_ack++;
+ wait_ack(2);
+ }
}
}
@@ -296,6 +319,8 @@ scanfolders(char **flds) {
scanfolder(*flds);
flds++;
}
+ if (handshake)
+ wait_ack(0);
}
/*
@@ -373,7 +398,7 @@ main (int argc, char **argv)
/*char *progname = argv[0];*/
int index = 0;
- while ((optc = getopt_long(argc, argv, "snhv", longopts, (int *)0)) != EOF)
+ while ((optc = getopt_long(argc, argv, "s:nhvf:x", longopts, (int *)0)) != EOF)
{
switch (optc) {
case 's':
@@ -393,6 +418,9 @@ main (int argc, char **argv)
break;
case 'f':
DUMP_FIELD = optarg;
+ break;
+ case 'x':
+ handshake = 1;
break;
default:
usage(progname);
diff -rpu mew-1.95b54/mew-scan.el mew-1.95b54.koie/mew-scan.el
--- mew-1.95b54/mew-scan.el Fri Aug 18 13:58:55 2000
+++ mew-1.95b54.koie/mew-scan.el Sat Aug 19 18:17:34 2000
@@ -225,7 +225,7 @@
())
(t
(condition-case nil
- (let ((process-connection-type mew-connection-type2)
+ (let ((process-connection-type mew-connection-type1)
process buf bnm)
(buffer-disable-undo (current-buffer))
(if (not (eq major-mode mode)) (funcall mode))
@@ -248,7 +248,7 @@
(mew-erase-buffer)
(setq mew-scan-ids nil))
(setq process (start-process (mew-scan-process-name bnm)
- buf mew-prog-mewls bnm range))
+ buf mew-prog-mewls "-x" bnm range))
(setq mew-summary-buffer-process process)
(mew-set-process-cs process mew-cs-text-for-read mew-cs-dummy)
;; text may be broken, so undecided is very dangerous!
@@ -289,7 +289,8 @@
;; move the cursor to the original position.
(goto-char opos)))
(forward-line)
- (delete-region (point-min) (point))))))
+ (delete-region (point-min) (point))
+ (process-send-string process "\n")))))
(defun mew-summary-scan-sentinel (process event)
(let ((pnm (process-name process))
--
KOIE Hidetaka 鯉江英隆 <hide at example.com>
Mew-dist メーリングリストの案内