annotate rep/channel/SelectorSimulator.java @ 430:03ab374605a6

Test program termination.
author one
date Sat, 02 Jan 2010 04:16:25 +0900
parents b8efd57faf78
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
1 package rep.channel;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
2
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
3 import java.io.IOException;
174
72252e970a8b *** empty log message ***
kent
parents: 143
diff changeset
4 import java.nio.channels.SelectableChannel;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
5 import java.nio.channels.SelectionKey;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
6 import java.nio.channels.Selector;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
7 import java.nio.channels.spi.SelectorProvider;
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
8 import java.util.HashMap;
176
9cf8147591ea *** empty log message ***
kent
parents: 175
diff changeset
9 import java.util.HashSet;
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
10 import java.util.Map;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
11 import java.util.Set;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
12
194
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
13 public class SelectorSimulator<P> extends REPSelector<P>{
308
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
14
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
15 // This selector cannot be shared among threads.
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
16
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
17 private Map<SelectableChannel, SelectionKeySimulator<P>> keyList;
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
18 private Set<SelectionKeySimulator<P>> selectedKeys;
314
edb373aa421e use channel lock instead of selector lock.
kono
parents: 308
diff changeset
19 private boolean isOpen=true;
308
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
20
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
21 public SelectorSimulator() {
125
9faacdd6c9cb *** empty log message ***
pin
parents: 123
diff changeset
22 super(null);
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
23 keyList = new HashMap<SelectableChannel,SelectionKeySimulator<P>>();
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
24 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
25
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
26 public int select() throws IOException {
430
03ab374605a6 Test program termination.
one
parents: 351
diff changeset
27 getSelectedKeys();
03ab374605a6 Test program termination.
one
parents: 351
diff changeset
28 if(selectedKeys.isEmpty()) {
03ab374605a6 Test program termination.
one
parents: 351
diff changeset
29 try {
03ab374605a6 Test program termination.
one
parents: 351
diff changeset
30 synchronized(this) {
03ab374605a6 Test program termination.
one
parents: 351
diff changeset
31 wait();
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
32 }
430
03ab374605a6 Test program termination.
one
parents: 351
diff changeset
33 } catch (InterruptedException e) {
03ab374605a6 Test program termination.
one
parents: 351
diff changeset
34 throw new IOException();
03ab374605a6 Test program termination.
one
parents: 351
diff changeset
35 }
234
0498425202a4 made ChannelSimulator no extends SelectableChannelSimulator
kent
parents: 210
diff changeset
36 }
0498425202a4 made ChannelSimulator no extends SelectableChannelSimulator
kent
parents: 210
diff changeset
37 return selectedKeys.size();
0498425202a4 made ChannelSimulator no extends SelectableChannelSimulator
kent
parents: 210
diff changeset
38 }
210
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
39
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
40 @Override
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
41 public int select(long timeout) throws IOException {
308
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
42 getSelectedKeys();
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
43 if(selectedKeys.isEmpty()) {
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
44 try {
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
45 synchronized(this) {
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
46 wait(timeout);
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
47 }
314
edb373aa421e use channel lock instead of selector lock.
kono
parents: 308
diff changeset
48 // we cannot know if we time outed or not
308
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
49 getSelectedKeys();
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
50 } catch (InterruptedException e) {
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
51 throw new IOException();
308
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
52 }
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
53 }
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
54 return selectedKeys.size();
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
55 }
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
56
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
57 private void getSelectedKeys() {
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
58 selectedKeys = new HashSet<SelectionKeySimulator<P>>();
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
59 for(SelectionKeySimulator<P> key : keyList.values()){
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
60 if(key.isAble())
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
61 selectedKeys.add(new SelectionKeySimulator<P>(key));
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
62 }
308
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
63 }
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
64
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
65 @Override
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
66 public int selectNow() throws IOException {
308
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
67 getSelectedKeys();
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
68 return selectedKeys.size();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
69 }
190
63701e2a2fe8 *** empty log message ***
kent
parents: 176
diff changeset
70
197
8d7c74610b05 *** empty log message ***
kent
parents: 194
diff changeset
71 public SelectionKeySimulator<P> register(SelectableChannel cs, int opt){
190
63701e2a2fe8 *** empty log message ***
kent
parents: 176
diff changeset
72 return register(cs, opt, null);
63701e2a2fe8 *** empty log message ***
kent
parents: 176
diff changeset
73 }
197
8d7c74610b05 *** empty log message ***
kent
parents: 194
diff changeset
74 public SelectionKeySimulator<P> register(SelectableChannel cs, int opt, Object handler){
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
75 SelectionKeySimulator<P> key = keyList.get(cs);
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
76 if (key!=null) {
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
77 key.attach(handler);
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
78 key.interestOps(opt);
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
79 return key;
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
80 }
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
81 key = new SelectionKeySimulator<P>(cs, opt, this);
174
72252e970a8b *** empty log message ***
kent
parents: 143
diff changeset
82 key.attach(handler);
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
83 keyList.put(cs,key);
174
72252e970a8b *** empty log message ***
kent
parents: 143
diff changeset
84 return key;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
85 }
308
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
86
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
87 public SelectionKeySimulator<P> deregister(SelectableChannel channel) {
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
88 SelectionKeySimulator<P> key = keyList.remove(channel);
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
89 return key;
298
cf9328e66d25 *** empty log message ***
kono
parents: 234
diff changeset
90 }
308
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
91
194
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
92
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
93 public SelectionKey getKey(SelectableChannel channel){
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
94 return keyList.get(channel);
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
95 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
96
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
97 @Override
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
98 public void close() throws IOException {
314
edb373aa421e use channel lock instead of selector lock.
kono
parents: 308
diff changeset
99 isOpen = false;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
100 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
101
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
102 @Override
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
103 public boolean isOpen() {
314
edb373aa421e use channel lock instead of selector lock.
kono
parents: 308
diff changeset
104 return isOpen;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
105 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
106
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
107 @Override
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
108 public Set<SelectionKey> keys() {
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
109 Set<SelectionKey> newKeys = new HashSet<SelectionKey>();
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
110 for(SelectionKey k: keyList.values()) {
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
111 newKeys.add(k);
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
112 }
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
113 return newKeys;
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
114 }
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
115
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
116 public Set<REPSelectionKey<P>> keys1() {
351
b8efd57faf78 *** empty log message ***
kono
parents: 350
diff changeset
117 // we cannot solve cast, we need the same method again with different types
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
118 Set<REPSelectionKey<P>> newKeys = new HashSet<REPSelectionKey<P>>();
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
119 for(SelectionKeySimulator<P> k: keyList.values()) {
351
b8efd57faf78 *** empty log message ***
kono
parents: 350
diff changeset
120 newKeys.add(k);
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
121 }
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
122 return newKeys;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
123 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
124
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
125 @Override
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
126 public SelectorProvider provider() {
351
b8efd57faf78 *** empty log message ***
kono
parents: 350
diff changeset
127 // should return NetworkSimulator?
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
128 return null;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
129 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
130
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
131
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
132 @Override
308
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
133 public synchronized Selector wakeup() {
c5be84d53c7f *** empty log message ***
kono
parents: 298
diff changeset
134 notifyAll();
210
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
135 return this;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
136 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
137
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
138
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
139 public Set<REPSelectionKey<P>> selectedKeys1() {
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
140 Set<REPSelectionKey<P>> newKeys = new HashSet<REPSelectionKey<P>>();
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
141 for(SelectionKeySimulator<P> k: selectedKeys) {
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
142 newKeys.add(k);
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
143 }
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
144 return newKeys;
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
145 }
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
146
351
b8efd57faf78 *** empty log message ***
kono
parents: 350
diff changeset
147 /*
b8efd57faf78 *** empty log message ***
kono
parents: 350
diff changeset
148 * type safe copy of selectedKeys1()
b8efd57faf78 *** empty log message ***
kono
parents: 350
diff changeset
149 */
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
150 @Override
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
151 public Set<SelectionKey> selectedKeys() {
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
152 Set<SelectionKey> newKeys = new HashSet<SelectionKey>();
351
b8efd57faf78 *** empty log message ***
kono
parents: 350
diff changeset
153 for(SelectionKeySimulator<P> k: selectedKeys) {
b8efd57faf78 *** empty log message ***
kono
parents: 350
diff changeset
154 newKeys.add(k);
350
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
155 }
59ef23ee73ad SelectorSimulator is not thread safe now.
kono
parents: 349
diff changeset
156 return newKeys;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
157 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
158
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
159 }