annotate rep/channel/SelectorSimulator.java @ 225:e173411a2499

*** empty log message ***
author kent
date Sun, 31 Aug 2008 13:32:15 +0900
parents 3e0cd34d625d
children 0498425202a4
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;
176
9cf8147591ea *** empty log message ***
kent
parents: 175
diff changeset
8 import java.util.HashSet;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
9 import java.util.Set;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
10
194
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
11 public class SelectorSimulator<P> extends REPSelector<P>{
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
12
176
9cf8147591ea *** empty log message ***
kent
parents: 175
diff changeset
13 private Set<SelectionKey> keyList;
9cf8147591ea *** empty log message ***
kent
parents: 175
diff changeset
14 private Set<SelectionKey> selectedKeys;
210
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
15 private boolean wakeFlag=false;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
16
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
17 public SelectorSimulator() {
125
9faacdd6c9cb *** empty log message ***
pin
parents: 123
diff changeset
18 super(null);
176
9cf8147591ea *** empty log message ***
kent
parents: 175
diff changeset
19 keyList = new HashSet<SelectionKey>();
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
20 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
21
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
22 public int select() throws IOException {
176
9cf8147591ea *** empty log message ***
kent
parents: 175
diff changeset
23 selectedKeys = new HashSet<SelectionKey>();
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
24
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
25 synchronized(this) {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
26
210
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
27 while(selectedKeys.isEmpty() && !wakeFlag){
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
28 for(SelectionKey key : keyList){
210
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
29 if(((SelectionKeySimulator<?>) key).isAble())
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
30 selectedKeys.add(key);
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
31 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
32
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
33 if(selectedKeys.isEmpty())
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
34 try {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
35 this.wait();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
36 } catch (InterruptedException e) {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
37 throw new IOException("Error, Selector was interrupted!");
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
38 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
39 }
210
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
40 wakeFlag=false;
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
41 }
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
42 return selectedKeys.size();
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
43 }
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
44
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
45 @Override
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
46 public int selectNow() throws IOException {
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
47 selectedKeys = new HashSet<SelectionKey>();
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
48
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
49 synchronized(this) {
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
50 for(SelectionKey key : keyList){
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
51 if(((SelectionKeySimulator<?>) key).isAble())
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
52 selectedKeys.add(key);
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
53 }
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
54 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
55 return selectedKeys.size();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
56 }
190
63701e2a2fe8 *** empty log message ***
kent
parents: 176
diff changeset
57
197
8d7c74610b05 *** empty log message ***
kent
parents: 194
diff changeset
58 public SelectionKeySimulator<P> register(SelectableChannel cs, int opt){
190
63701e2a2fe8 *** empty log message ***
kent
parents: 176
diff changeset
59 return register(cs, opt, null);
63701e2a2fe8 *** empty log message ***
kent
parents: 176
diff changeset
60 }
197
8d7c74610b05 *** empty log message ***
kent
parents: 194
diff changeset
61 public SelectionKeySimulator<P> register(SelectableChannel cs, int opt, Object handler){
8d7c74610b05 *** empty log message ***
kent
parents: 194
diff changeset
62 SelectionKeySimulator<P> key = new SelectionKeySimulator<P>(cs, opt, this);
174
72252e970a8b *** empty log message ***
kent
parents: 143
diff changeset
63 key.attach(handler);
72252e970a8b *** empty log message ***
kent
parents: 143
diff changeset
64 keyList.add(key);
72252e970a8b *** empty log message ***
kent
parents: 143
diff changeset
65 return key;
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
66 }
194
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
67
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
68
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
69 public Set<REPSelectionKey<P>> selectedKeys1() {
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
70 Set<SelectionKey> keys = keyList;
197
8d7c74610b05 *** empty log message ***
kent
parents: 194
diff changeset
71 Set<REPSelectionKey<P>> newKeys = new HashSet<REPSelectionKey<P>>();
194
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
72 for(SelectionKey k: keys) {
197
8d7c74610b05 *** empty log message ***
kent
parents: 194
diff changeset
73 // REPSelectionKeyを生成しないように注意
8d7c74610b05 *** empty log message ***
kent
parents: 194
diff changeset
74 newKeys.add(new SelectionKeySimulator<P>(k));
194
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
75 }
197
8d7c74610b05 *** empty log message ***
kent
parents: 194
diff changeset
76 return newKeys;//(Set<REPSelectionKey<P>>)newKeys;
194
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
77 }
be219ba8b39c *** empty log message ***
kono
parents: 190
diff changeset
78
143
785a3e8ea858 *** empty log message ***
kent
parents: 125
diff changeset
79 public <T> SelectionKey getKey(ChannelSimulator<T> channel){
123
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
80 for(SelectionKey key : keyList){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
81 if(key.channel() == channel)
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
82 return key;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
83 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
84 return null;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
85 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
86
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
87 @Override
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
88 public void close() throws IOException {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
89 // TODO Auto-generated method stub
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
90
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
91 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
92
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
93 @Override
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
94 public boolean isOpen() {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
95 // TODO Auto-generated method stub
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
96 return false;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
97 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
98
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
99 @Override
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
100 public Set<SelectionKey> keys() {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
101 // TODO Auto-generated method stub
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
102 return null;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
103 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
104
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
105 @Override
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
106 public SelectorProvider provider() {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
107 // TODO Auto-generated method stub
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
108 return null;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
109 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
110
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
111 @Override
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
112 public int select(long timeout) throws IOException {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
113 // TODO Auto-generated method stub
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
114 return 0;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
115 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
116
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
117 @Override
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
118 public Selector wakeup() {
210
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
119 synchronized(this){
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
120 this.notifyAll();
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
121 }
3e0cd34d625d *** empty log message ***
kent
parents: 204
diff changeset
122 return this;
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 Set<SelectionKey> selectedKeys() {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
127 // TODO Auto-generated method stub
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
128 return (Set<SelectionKey>)selectedKeys;
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 }