annotate dreactor/core/Vat.d @ 9:5412a1ff2e49

adding chat client and more updates
author rick@minifunk
date Sat, 12 Jul 2008 10:42:41 -0400
parents 60cf25102fb2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
1 /*******************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
2
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
3 copyright: Copyright (c) 2008 Rick Richardson. All rights reserved
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
4
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
5 license: BSD style: $(LICENSE)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
6
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
7 version: Initial release v0.1 : May 2008
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
8
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
9 author: Rick Richardson
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
10
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
11 *******************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
12
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 3
diff changeset
13 module dreactor.core.Vat;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
14
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
15 import tango.io.selector.Selector;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
16 import tango.io.selector.model.ISelector;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
17 import tango.core.Exception;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
18 import tango.core.Thread;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
19 import tango.core.Atomic;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
20 import tango.util.collection.LinkSeq;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
21 import tango.util.log.Log;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
22
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
23 import dreactor.transport.AsyncSocketConduit;
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
24 import dreactor.core.Dispatcher;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
25 import dreactor.util.ThreadSafeQueue;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
26
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
27 Logger log;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
28
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
29 enum : int {CLOSE = -2, UNREGISTER = -1, REMAIN = 0, REGISTER = 1, REREGISTER = 2};
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
30
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 3
diff changeset
31 static char[] version_string = "Vat.d 0.1 2008-05-31";
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
32
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 3
diff changeset
33 class Vat
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
34 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
35 private
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
36 Thread thread;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
37 bool running;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
38 Atomic!(int) pending;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
39
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
40 ThreadSafeQueue!(Dispatcher) freshList;
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
41 ThreadSafeQueue!(Dispatcher) remList;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
42 public
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
43 this()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
44 {
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
45 freshList = new ThreadSafeQueue!(Dispatcher);
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
46 remList = new ThreadSafeQueue!(Dispatcher);
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 3
diff changeset
47 log = Log.lookup("dreactor.core.Vat");
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
48 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
49
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
50 void run()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
51 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
52 running = true;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
53 thread = new Thread(&eventLoop);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
54 thread.start();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
55 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
56
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
57 void exit()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
58 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
59 running = false;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
60 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
61
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
62 void wait()
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
63 {
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
64 thread.join();
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
65 }
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
66
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
67 bool addConnection(Dispatcher handler)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
68 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
69 log.trace("adding handler");
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
70 return freshList.push(handler);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
71 }
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
72
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
73 bool remConnection(Dispatcher handler)
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
74 {
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
75 return remList.push(handler);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
76 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
77
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
78 private
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
79 void eventLoop()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
80 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
81 auto selector = new Selector();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
82 selector.open();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
83 do
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
84 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
85 auto eventCount = selector.select(0.01);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
86
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
87 if (eventCount > 0)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
88 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
89 // process events
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
90 foreach (SelectionKey key; selector.selectedSet())
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
91 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
92 if (key.isReadable())
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
93 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
94 // incoming data
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
95 log.trace("Read event fired");
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
96 auto conn = cast(Dispatcher) key.attachment;
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
97 if ( Dispatcher.State.listening == conn.getState() )
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
98 conn.handleConnection(conn.transport, &addConnection);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
99 else
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
100 processReturn(conn.handleIncoming(), selector, conn);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
101 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
102 else if (key.isWritable())
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
103 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
104 log.trace("Write event fired");
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
105 auto conn = cast(Dispatcher) key.attachment;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
106 processReturn(conn.handleOutgoing(), selector, conn);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
107 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
108 else if (key.isHangup())
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
109 {
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 3
diff changeset
110 log.trace("Hangup event fired");
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
111 auto conn = cast(Dispatcher) key.attachment;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
112 processReturn(conn.handleDisconnect(), selector, conn);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
113 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
114 else if (key.isError() || key.isInvalidHandle())
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
115 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
116 log.trace("Error event fired");
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
117 // error, close connection
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
118 auto conn = cast(Dispatcher) key.attachment;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
119 conn.handleError(&remConnection);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
120 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
121 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
122 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
123 else if (eventCount == 0)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
124 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
125 /* can't think of anything useful to do here. */
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
126 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
127 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
128 {
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
129 log.error("Selector.select returned {}", eventCount);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
130 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
131 //add Conduits to listener
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
132 freshList.processAll( (ref Dispatcher h)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
133 {
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
134 selector.register(h.transport, h.events(), h);
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
135 return 1;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
136 });
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
137 remList.processAll( (ref Dispatcher h)
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
138 {
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
139 selector.unregister(h.transport);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
140 return 1;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
141 });
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
142
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
143 } while (running)
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
144
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
145 }
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
146
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
147 void processReturn(int result, Selector s, Dispatcher h)
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
148 {
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
149 switch(result)
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
150 {
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
151 case CLOSE:
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
152 s.unregister(h.transport);
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
153 h.transport.detach();
8
60cf25102fb2 fixing mercurial's screwup
rick@minifunk
parents: 6
diff changeset
154 break;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
155 case UNREGISTER:
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
156 s.unregister(h.transport);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
157 break;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
158 case REMAIN:
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
159 //this space intentially left blank
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
160 break;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
161 case REGISTER:
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
162 s.register(h.transport, h.events(), h);
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
163 break;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
164 case REREGISTER:
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 8
diff changeset
165 s.register(h.transport, h.events(), h);
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
166 break;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
167 default:
5
f875a1f278b8 housekeeping
rick@minifunk
parents: 3
diff changeset
168 log.error("processReturn: unknown return value");
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
169 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
170 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
171 }