annotate dreactor/transport/AsyncSocketConduit.d @ 2:d3374d553986

updates
author rick@minifunk
date Thu, 12 Jun 2008 23:12:17 -0400
parents 7a315154bf5e
children e3dbc9208822
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
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
3 copyright: Copyright (c) 2004 Kris Bell. All rights reserved
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
4
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
5 license: BSD style: $(LICENSE)
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
6
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
7 version: Mar 2004 : Initial release
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
8 version: Jan 2005 : RedShodan patch for timeout query
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
9 version: Dec 2006 : Outback release
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
10
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
11 author: Kris, modified by Rick Richardson (May 2008)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
12
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
13 *******************************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
14
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
15 module dreactor.transport.AsyncSocketConduit;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
16
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
17 private import tango.time.Time;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
18
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
19 public import tango.io.Conduit;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
20
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
21 private import tango.net.Socket;
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
22
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
23 import tango.net.Socket.Address;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
24
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
25 /*******************************************************************************
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
26
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
27 A wrapper around the bare Socket to implement the IConduit abstraction
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
28 and add socket-specific functionality specifically for multiplexing via
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
29 poll and the ilk.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
30
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
31 AsyncSocketConduit data-transfer is typically performed in conjunction with
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
32 an IBuffer, but can happily be handled directly using void array where
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
33 preferred
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
34
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
35 *******************************************************************************/
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
36 alias IPv4Address Address;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
37
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
38 class AsyncSocketConduit : Conduit
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
39 {
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
40 package Socket socket_;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
41
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
42 /***********************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
43
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
44 Create a streaming Internet Socket
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
45
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
46 ***********************************************************************/
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
47 /* overriding the enum from the IConduit interface */
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
48 enum : uint
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
49 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
50 Eof = uint.max, /// the End-of-Flow identifer
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
51 Err = uint.max -1 // some error ocurred, Should disconnect
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
52 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
53
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
54 this ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
55 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
56 this (SocketType.STREAM, ProtocolType.TCP);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
57 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
58
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
59 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
60
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
61 Create an Internet Socket. Used by subclasses and by
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
62 ServerSocket; the latter via method allocate() below
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
63
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
64 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
65
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
66 protected this (SocketType type, ProtocolType protocol, bool create=true)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
67 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
68 socket_ = new Socket (AddressFamily.INET, type, protocol, create);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
69 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
70
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
71 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
72
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
73 Return the name of this device
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
74
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
75 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
76
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
77 override char[] toString()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
78 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
79 return socket.toString;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
80 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
81
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
82 /***********************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
83
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
84 Return the socket wrapper
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
85
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
86 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
87
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
88 Socket socket ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
89 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
90 return socket_;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
91 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
92
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
93 /***********************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
94
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
95 Return a preferred size for buffering conduit I/O
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
96
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
97 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
98
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
99 override uint bufferSize ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
100 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
101 return 1024 * 8;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
102 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
103
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
104 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
105
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
106 Models a handle-oriented device.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
107
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
108 TODO: figure out how to avoid exposing this in the general
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
109 case
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
110
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
111 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
112
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
113 override Handle fileHandle ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
114 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
115 return cast(Handle) socket_.fileHandle;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
116 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
117
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
118 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
119
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
120 Is this socket still alive?
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
121
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
122 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
123
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
124 override bool isAlive ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
125 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
126 return socket_.isAlive;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
127 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
128
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
129 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
130
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
131 Connect to the provided endpoint
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
132
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
133 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
134
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
135 AsyncSocketConduit connect (Address addr)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
136 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
137 socket_.connect (addr);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
138 return this;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
139 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
140
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
141 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
142
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
143 Bind the socket. This is typically used to configure a
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
144 listening socket (such as a server or multicast socket).
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
145 The address given should describe a local adapter, or
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
146 specify the port alone (ADDR_ANY) to have the OS assign
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
147 a local adapter address.
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
148
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
149 ***********************************************************************/
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
150
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
151 AsyncSocketConduit bind (Address address)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
152 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
153 socket_.bind (address);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
154 return this;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
155 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
156
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
157 /**************************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
158
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
159 Enable the socket for listening
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
160
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
161 **************************************************************************/
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
162 AsyncSocketConduit listen()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
163 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
164 socket_.listen();
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
165 return this;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
166 }
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
167
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
168 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
169
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
170 Inform other end of a connected socket that we're no longer
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
171 available. In general, this should be invoked before close()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
172 is invoked
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
173
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
174 The shutdown function shuts down the connection of the socket:
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
175
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
176 - stops receiving data for this socket. If further data
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
177 arrives, it is rejected.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
178
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
179 - stops trying to transmit data from this socket. Also
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
180 discards any data waiting to be sent. Stop looking for
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
181 acknowledgement of data already sent; don't retransmit
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
182 if any data is lost.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
183
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
184 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
185
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
186 AsyncSocketConduit shutdown ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
187 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
188 socket_.shutdown (SocketShutdown.BOTH);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
189 return this;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
190 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
191
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
192 /***********************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
193
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
194 Release this AsyncSocketConduit
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
195
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
196 Note that one should always disconnect a AsyncSocketConduit
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
197 under normal conditions, and generally invoke shutdown
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
198 on all connected sockets beforehand
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
199
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
200 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
201
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
202 override void detach ()
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
203 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
204 socket_.detach;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
205
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
206 // deallocate if this came from the free-list,
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
207 // otherwise just wait for the GC to handle it
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
208 if (fromList)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
209 deallocate (this);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
210 }
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
211
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
212 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
213
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
214 Read content from the socket.
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
215
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
216 Returns the number of bytes read from the socket, or
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
217 IConduit.Eof where there's no more content available
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
218
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
219 Note that a timeout is equivalent to Eof. Isolating
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
220 a timeout condition can be achieved via hadTimeout()
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
221
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
222 Note also that a zero return value is not legitimate;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
223 such a value indicates Eof
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
224
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
225 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
226
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
227 override uint read (void[] dst)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
228 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
229 return read (dst, (void[] dst){return socket_.receive(dst);});
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
230 }
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
231
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
232 /***********************************************************************
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
233
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
234 Callback routine to write the provided content to the
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
235 socket. This will stall until the socket responds in
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
236 some manner. Returns the number of bytes sent to the
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
237 output, or IConduit.Eof if the socket cannot write.
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
238
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
239 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
240
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
241 override uint write (void[] src)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
242 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
243 int count = socket_.send (src);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
244 if (count == 0)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
245 count = Eof;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
246 else if (count < 0)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
247 count = Err;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
248 return count;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
249 }
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
250
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
251 /***********************************************************************
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
252
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
253 Internal routine to handle socket read under a timeout.
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
254 Note that this is synchronized, in order to serialize
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
255 socket access
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
256
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
257 ***********************************************************************/
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
258
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
259 package final uint read (void[] dst, int delegate(void[]) dg)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
260 {
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
261 // invoke the actual read op
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
262 int count = dg (dst);
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
263 if (count == 0)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
264 return Eof;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
265 else if (count < 0)
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
266 return Err;
0
7a315154bf5e Initial commit
rick@minifunk
parents:
diff changeset
267
2
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
268 return count;
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
269 }
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
270
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
271 }
d3374d553986 updates
rick@minifunk
parents: 0
diff changeset
272