annotate rep/simulator/SelectableChannelSimulator.java @ 123:5b1a0574b406 add-simulator

*** empty log message ***
author pin
date Wed, 27 Aug 2008 17:21:25 +0900
parents
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.simulator;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
2
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
3 import java.nio.channels.SelectableChannel;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
4 import java.util.concurrent.BlockingQueue;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
5 import java.util.concurrent.LinkedBlockingQueue;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
6
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
7
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
8
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
9 public abstract class SelectableChannelSimulator<P> extends SelectableChannel{
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
10 protected BlockingQueue<P> qread;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
11 protected BlockingQueue<P> qwrite;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
12 protected SelectorSimulator<P> writeSelector;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
13 protected SelectorSimulator<P> readSelector;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
14
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
15 /* read from Queue. */
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
16 public P read(){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
17 try {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
18 if(readSelector!=null)
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
19 synchronized (readSelector){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
20 return qread.take();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
21 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
22 else{
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
23 return qread.take();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
24 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
25 } catch (InterruptedException e) {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
26 e.printStackTrace();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
27 return null;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
28 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
29 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
30 /* write to Queue. */
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
31 public boolean write(P p){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
32 try {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
33 if (writeSelector!=null)
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
34 synchronized (writeSelector){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
35 qwrite.put(p);
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
36 writeSelector.notifyAll();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
37 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
38 else {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
39 qwrite.put(p);
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
40 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
41 return true;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
42 } catch (InterruptedException e) {
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
43 e.printStackTrace();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
44 return false;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
45 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
46 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
47 public abstract ChannelSimulator<P> accept();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
48
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
49 /* accessor methods. */
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
50 public BlockingQueue<P> getReadQ(){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
51 return qread;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
52 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
53 public BlockingQueue<P> getWriteQ(){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
54 return qwrite;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
55 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
56 public void createReadQ(){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
57 qread = new LinkedBlockingQueue<P>();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
58 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
59 public void createWriteQ(){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
60 qwrite = new LinkedBlockingQueue<P>();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
61 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
62 public void setWriteSelector(SelectorSimulator<P> _selector){
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
63 writeSelector = _selector;
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
64 }
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
65
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
66
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
67 /* return state of the Queue */
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
68 abstract public boolean isReadable();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
69 abstract public boolean isWritable();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
70 abstract public boolean isAcceptable();
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
71
5b1a0574b406 *** empty log message ***
pin
parents:
diff changeset
72 }