[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 メーリングリストの案内