annotate dreactor/core/Dispatcher.d @ 11:5836613d16ac

reorg! reorg!
author rick@minifunk
date Tue, 12 Aug 2008 16:59:56 -0400
parents 5412a1ff2e49
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
1 module dreactor.protocol.Dispatcher;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
2
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
3 import tango.io.selector.model.ISelector;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
4 import tango.util.collection.CircularSeq;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
5 import tango.net.Socket;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
6 public import tango.core.Exception;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
7 import dreactor.transport.AsyncSocketConduit;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
8
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
9 import tango.util.log.Log;
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
10 import tango.util.log.Config;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
11
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
12 class Dispatcher
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
13 {
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
14 public
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
15 this (Conduit trans)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
16 {
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
17 cond = trans;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
18 ibuf_len = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
19 o_offset = 0;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
20 out_buffers = new CircularSeq!(char[]);
6
287ba7de97c4 more housekeeping
rick@minifunk
parents: 5
diff changeset
21 log = Log.lookup("dreactor.core.Dispatcher");
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
22 }
9
5412a1ff2e49 adding chat client and more updates
rick@minifunk
parents: 6
diff changeset
23
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
24 /**************************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
25
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
26 onSend -- Send method
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
27 Called by the vat in response to a FD writeable event.
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
28 Sends data, returns amount sent. Unregisters Handler for sending
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
29 if there is no more data left to send.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
30
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
31 ***************************************************************************/
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
32 public int onSend()
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
33 {
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
34 Logger log = Log.lookup("Handlers.onSend");
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
35
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
36 char[] outbuf = nextBuffer();
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
37 if (outbuf !is null)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
38 {
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
39 int sent = cond.write(outbuf);
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
40 if (sent > 0)
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
41 {
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
42 if (! addOffset(sent))
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
43 {
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
44 return UNREGISTER;
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
45 }
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
46 }
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
47 else if (sent == 0)
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
48 {
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
49 log.error("Select said socket was writable, but sent 0 bytes");
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
50 }
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
51 else
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
52 {
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
53 log.error("Socket send return ERR {}", sent);
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
54 }
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
55 return REMAIN;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
56 }
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
57 else
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
58 {
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
59 return UNREGISTER;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
60 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
61 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
62
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
63 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
64
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
65 appendOutBuffer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
66
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
67 Adds an outgoing buffer to the list. This returns true if the list
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
68 was empty, indicating that the handler should be registered with the
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
69 SelectLoop. If it returns false, it was probably already registered.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
70
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
71 **************************************************************************/
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
72 bool appendOutBuffer(char[] outbuf)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
73 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
74 out_buffers.append(outbuf);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
75 out_buffers_len++;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
76 if (out_buffers_len == 1)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
77 return true;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
78 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
79 return false;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
80 }
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
81
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
82 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
83
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
84 addOffset
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
85 Use this function to update the offset position after a successful data
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
86 send. This not only manages the current offset, but will update the
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
87 out buffer chain if necessary.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
88
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
89 Returns: false if there is nothing left to send, true if there is.
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
90
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
91 **************************************************************************/
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
92 bool addOffset(int off)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
93 in
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
94 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
95 assert(out_buffers_len > 0);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
96 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
97 body
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
98 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
99 char[] hd = out_buffers.head();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
100 if ((off + o_offset) >= hd.length)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
101 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
102 out_buffers.removeHead();
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
103 o_offset = 0;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
104 out_buffers_len--;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
105 return (out_buffers_len > 0);
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
106 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
107 else
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
108 o_offset += off;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
109 return true;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
110 }
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
111
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
112 /**************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
113
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
114 char[] nextBuffer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
115
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
116 Returns a slice of the current outbound buffer, returns a char[] pointing
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
117 to null if there is no current outbound buffer
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
118
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
119 **************************************************************************/
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
120 synchronized char[] nextBuffer()
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
121 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
122 if (out_buffers_len < 1)
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
123 {
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
124 return null;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
125 }
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
126
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
127 return out_buffers.head()[o_offset .. $];
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
128 }
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
129
11
5836613d16ac reorg! reorg!
rick@minifunk
parents: 9
diff changeset
130 Conduit cond;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
131 CircularSeq!(char[]) out_buffers;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
132 int out_buffers_len;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
133 int ibuf_len;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
134 int o_offset;
3
e3dbc9208822 basic tests working
rick@minifunk
parents: 2
diff changeset
135 Logger log;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
136 }