changeset 323:1e605880d49e

*** empty log message ***
author kono
date Fri, 10 Oct 2008 18:04:09 +0900
parents 5893fd8c0f50
children e235998427a6
files Todo rep/Editor.java rep/Session.java rep/SessionManager.java rep/translater/TranslaterImp1.java
diffstat 5 files changed, 36 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/Todo	Fri Oct 10 16:18:03 2008 +0900
+++ b/Todo	Fri Oct 10 18:04:09 2008 +0900
@@ -1,5 +1,6 @@
 Fri Oct 10 15:24:42 JST 2008
-host name とsidで unique  にしているらしい。なので、SessionにはsessionNameが必須。(kono)
+sid は大域的にuniqueにする必要がある。UPDATEで新しくsessionを作ったことを
+通知して、Masterが新しいsidを決定し、UPDATE_ACKで他のSessionManagerに知らせる(kono)
 
 Mon Oct  6 16:39:57 JST 2008
 
@@ -8,10 +9,12 @@
 
 Todo:
 SessionManager の向うにあるeditorにREPCommandを送るコードがない。Editor 扱いしても良いが、Editor が複雑すぎるので、それは好ましくない。Editor に nextChannelを持たせるのが良いか? (kono)
+    Done: Forwarder を作った
 
 Todo:
 SessionManger のeditor がmerge 中のeditor commandをblockするのは良いが、
 sessionManger コマンドをblockされるのは困る。(kono)
+	Done: 
 
 Wed Oct  1 20:58:51 JST 2008
 	
--- a/rep/Editor.java	Fri Oct 10 16:18:03 2008 +0900
+++ b/rep/Editor.java	Fri Oct 10 18:04:09 2008 +0900
@@ -43,6 +43,7 @@
 				// Session Manager 側で、このeditorへの他のeditorからの
 				// 入力を止めて、merge にそなえる。merge は、eidtor 側から
 				// ACKが来てから始まる。
+				translater.startMerge(cmd);
 				return;
 			} else assert(false);
 		} else if(command.eid == eid){
@@ -74,12 +75,12 @@
 		return;
 	}
 	
-	boolean merge(Editor editor,REPCommand command) {
+	boolean merge(REPCommand command) {
 		REPCommand prev = translater.prev();
 		if(prev==null) return false;
 		assert(prev.eid==command.eid);
 		//マージして送信
-		return translater.catchOwnCommand(editor);
+		return translater.catchOwnCommand(this);
 	}
 
 	boolean checkReturnedCommand(REPCommand command) {
@@ -173,7 +174,17 @@
 			translate(next, receivedCommand);
 			break;
 		}
-		
+
+		case SMCMD_START_MERGE_ACK:
+		{
+			// マージの処理と次のエディタへコマンドを送信する処理
+			translater.mergeAck();
+			if (!merge(receivedCommand)) {
+				// nothing to do, send END_MERGE
+				endMerge();
+			}
+			break;
+		}
 		case SMCMD_QUIT:
 		{
 			next.send(receivedCommand);
--- a/rep/Session.java	Fri Oct 10 16:18:03 2008 +0900
+++ b/rep/Session.java	Fri Oct 10 18:04:09 2008 +0900
@@ -26,7 +26,10 @@
 			masterEditor = editor;
 			editor.setSID(sid);
 			editorList.add(editor);
-			if(editor.channel!=null) firstForwarder = editor;
+			if(editor.channel!=null) {
+				firstForwarder = editor;
+				masterEditor.setNext(masterEditor);
+			}
 		}
 	}
 	
--- a/rep/SessionManager.java	Fri Oct 10 16:18:03 2008 +0900
+++ b/rep/SessionManager.java	Fri Oct 10 18:04:09 2008 +0900
@@ -59,6 +59,7 @@
 	private static int receive_port;
 	private static int parent_port;
 	static final int DEFAULT_PORT = 8766;
+	private static final int packetLimit = 100;
 
 	public static void main(String[] args) throws InterruptedException, IOException {
 		
@@ -426,18 +427,6 @@
 		}
 			break;
 
-		case SMCMD_START_MERGE_ACK:
-		{
-			// sid から Session を取得
-			Session session = getSession(receivedCommand.sid);
-			// マージの処理と次のエディタへコマンドを送信する処理
-			Editor editor = session.getEditor(channel);
-			if (!editor.merge(editor,receivedCommand)) {
-				// nothing to do, send END_MERGE
-				editor.endMerge();
-			}
-			break;
-		}
 
 		default:
 			return false;
@@ -623,6 +612,7 @@
 
 	public void addWriteQueue(PacketSet packetSet) {
 		writeQueue.add(packetSet);
+		assert(writeQueue.size()<packetLimit) ;
 	}
 
 
--- a/rep/translater/TranslaterImp1.java	Fri Oct 10 16:18:03 2008 +0900
+++ b/rep/translater/TranslaterImp1.java	Fri Oct 10 18:04:09 2008 +0900
@@ -213,5 +213,16 @@
 		if(sentMergedList.size() > 0) return true;
 		return false;
 	}
-	
+
+	public void startMerge(REPCommand cmd) {
+		sentMergedList.add(cmd);
+		
+	}
+
+	public void mergeAck() {
+		sentMergedList.remove();
+	}
+
+
+
 }