Mercurial > hg > RemoteEditor > REPSessionManager
annotate rep/SessionManagerList.java @ 495:bd76f7e39247 no-global-seq-mode
comment
author | one |
---|---|
date | Sun, 24 Oct 2010 00:18:14 +0900 |
parents | 795ef563f2a0 |
children |
rev | line source |
---|---|
7 | 1 package rep; |
2 | |
3 import java.util.LinkedList; | |
356 | 4 |
401 | 5 import rep.channel.REPSocketChannel; |
382
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
6 import rep.handler.REPNode; |
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
7 import rep.handler.NullForwarder; |
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
8 |
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
9 public class SessionManagerList extends LinkedList<REPNode>{ |
56 | 10 |
356 | 11 /** |
411 | 12 * Session Manager List which we have a connection. |
356 | 13 */ |
14 private static final long serialVersionUID = 1L; | |
15 private int mySMID=0; | |
16 private int smid_root=0; | |
387 | 17 private REPNode parent=new NullForwarder(null,null); |
382
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
18 private LinkedList<REPNode> waiting= new LinkedList<REPNode>(); |
7 | 19 |
20 | |
382
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
21 public void setMaster(REPNode f) { |
349 | 22 this.parent = f; |
23 } | |
24 | |
25 public void sendToMaster(REPCommand repCmd) { | |
26 parent.send(repCmd); | |
27 } | |
28 | |
29 public void sendToSlaves(REPCommand repCmd) { | |
382
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
30 for(REPNode channel : this){ |
349 | 31 channel.send(repCmd); |
7 | 32 } |
33 } | |
34 | |
349 | 35 public boolean isMaster() { |
360 | 36 return !parent.isForwarder(); |
25 | 37 } |
21 | 38 |
411 | 39 /** |
40 * Add our slave session manager. Only an empty session manager can | |
41 * connect to the other session manager. join_sm() is forwarded to | |
42 * the master session manager, and in the master addNewSessionManager() | |
43 * is performed. | |
44 * | |
45 * @param sm | |
46 * @param receivedCommand | |
47 * @return session manager id (global) | |
48 */ | |
382
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
49 public int addNewSessionManager(REPNode sm,REPCommand receivedCommand) { |
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
50 add(sm); |
356 | 51 int sid = ++smid_root; |
382
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
52 sm.setSID(sid); |
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
53 sm.setName(receivedCommand.string); |
355 | 54 return sid; |
31 | 55 } |
56 | |
56 | 57 |
355 | 58 public void setSessionManagerID(int sid) { |
59 mySMID = sid; | |
60 } | |
61 | |
62 public int sessionManagerID() { | |
63 return mySMID; | |
64 } | |
65 | |
411 | 66 /** |
67 * An sm_join() is accepted, but we are not the master, forward request | |
68 * and register as an waiting sessin manager. | |
69 * @param fw | |
70 * @param command | |
71 */ | |
382
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
72 public void addWaitingSessionManager(REPNode fw, REPCommand command) { |
355 | 73 // SID assign 待ちのSessionManager Channelを登録する |
74 waiting.add(fw); | |
75 | |
76 } | |
77 | |
411 | 78 /** |
79 * An sm_join_ack() is received. Assign session manager id to the waiter. | |
80 * @param sid | |
81 */ | |
355 | 82 public void assignSessionManagerIDtoWaitingSM(int sid) { |
83 // 待っていたSession Manager ChannelにSession IDを登録し,Session Manager List | |
84 // に登録する。この次のsm_join_ackでSIDが確定する。 | |
382
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
85 REPNode waiter; |
355 | 86 if ((waiter=waiting.poll())!=null) { |
87 waiter.setSID(sid); | |
356 | 88 add(waiter); |
355 | 89 return; |
90 } | |
91 assert false; | |
92 } | |
93 | |
382
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
94 public void setParent(REPNode fw) { |
365
c432755c3555
distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents:
360
diff
changeset
|
95 parent = fw; |
c432755c3555
distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents:
360
diff
changeset
|
96 } |
367 | 97 |
382
4b87f89b3afd
REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents:
367
diff
changeset
|
98 public REPNode parent() { |
367 | 99 return parent; |
100 } | |
365
c432755c3555
distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents:
360
diff
changeset
|
101 |
401 | 102 public REPNode managerByChannel(REPSocketChannel<REPCommand> channel) { |
103 for(REPNode e:this) { | |
104 if (e.channel==channel) | |
105 return e; | |
106 } | |
107 return null; | |
108 } | |
78 | 109 |
7 | 110 } |