changeset 59:04eb9d562e60

*** empty log message ***
author gongo
date Wed, 27 Aug 2008 17:50:17 +0900
parents 4d087b06929a
children f0a30adf13de
files ChangeLog
diffstat 1 files changed, 44 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Aug 27 17:29:27 2008 +0900
+++ b/ChangeLog	Wed Aug 27 17:50:17 2008 +0900
@@ -1,5 +1,49 @@
 2008-08-27  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
 
+	* thinking:
+	テスト用SMGUIを使って、二つのSessionを立ち上げてみた。
+            
+	  / B (test.c)
+  	A 
+	  \ C (hoge.c)
+
+	B と C がそれぞれ Session を立ち上げ、A が両方に join した。
+	A が test.c バッファを開いている時に C が入力しても、
+	ちゃんと A の hoge.c バッファ に書き込まれているのは確認した。
+	と思ったけど、やっぱり少し問題があった。
+
+	process-filter 内で、remove-hook している。
+	これは、before/after-change-functions を呼ばれないように、
+	つまりは受け取ったパケットの処理でバッファが編集されても
+	その編集に対しては REPcommand を生成しないようにするためです。
+
+	それはいいんだけど、問題が少しあります。
+
+	1. A が B のバッファを開いている
+	2. C が送信した
+	3. A が受け取って remove-hook をかける (しかし、B のバッファのみ)
+	4. REPcommand 解析により、C のバッファに書き込む
+	5. C のバッファには remove-hook が掛かっていないため、
+	   その編集が REPcommand 生成され、C に送られる
+	6. C はポカーン
+
+	ってことだ。add-hook,remove-hook の 4つめの引数に nil 以外を設定すると
+	「この hook はカレントバッファにのみ適用されるYO」って意味なわけだ。
+	だから上の問題が起きたわけ。
+	じゃあどうすればいいかって、nil を設定(省略)すればいいわけ。
+	しかしそうなると全てのバッファに対して hook がかかる。
+	まあこれでいいんじゃないかってのもあるけどね。
+
+	SessionManager に接続しているバッファ(上でいうhoge.cとかtest.c)の確認は
+	redit-sinfo-get-buf2sinfo で nil 以外が返ってくればいい。
+	nil が来るってことは、そのバッファ(名)は登録されていないわけで。
+	なので、before/after-change-function の時は、
+	現在の buffer が登録されているかを確認して、そうでなければ
+	何もしないってコードをいれるだけでおk。だと思う。
+	全てのバッファに対してこの確認が入るので、そこらへんのコストが
+	どれだけの物かわからないけど、あるバッファへの hook の管理をするよりは
+	楽だし、案外軽いかもしれない。わからんけどね。
+	
 	* redit-client-sm.el (redit-client-after-change-function): 
 	下の変更により、ここでは SessionInfo から prev を取得している