# HG changeset patch # User kono # Date 1223629449 -32400 # Node ID 1e605880d49eb20461e4ba8619e478d58e5aea02 # Parent 5893fd8c0f50c1cc0d88b87340c2189dc5ee69bc *** empty log message *** diff -r 5893fd8c0f50 -r 1e605880d49e Todo --- 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 diff -r 5893fd8c0f50 -r 1e605880d49e rep/Editor.java --- 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); diff -r 5893fd8c0f50 -r 1e605880d49e rep/Session.java --- 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); + } } } diff -r 5893fd8c0f50 -r 1e605880d49e rep/SessionManager.java --- 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() 0) return true; return false; } - + + public void startMerge(REPCommand cmd) { + sentMergedList.add(cmd); + + } + + public void mergeAck() { + sentMergedList.remove(); + } + + + }