11
11
use option:: { Option , Some , None } ;
12
12
use result:: { Ok , Err } ;
13
13
use rt:: io:: net:: ip:: SocketAddr ;
14
- use rt:: io:: { Reader , Writer , Listener } ;
14
+ use rt:: io:: { Reader , Writer , Listener , Acceptor } ;
15
15
use rt:: io:: { io_error, read_error, EndOfFile } ;
16
16
use rt:: rtio:: { IoFactory , IoFactoryObject ,
17
- RtioSocket , RtioTcpListener ,
18
- RtioTcpListenerObject , RtioTcpStream ,
19
- RtioTcpStreamObject } ;
17
+ RtioSocket ,
18
+ RtioTcpListener , RtioTcpListenerObject ,
19
+ RtioTcpAcceptor , RtioTcpAcceptorObject ,
20
+ RtioTcpStream , RtioTcpStreamObject } ;
20
21
use rt:: local:: Local ;
21
22
22
23
pub struct TcpStream ( ~RtioTcpStreamObject ) ;
@@ -124,13 +125,27 @@ impl TcpListener {
124
125
}
125
126
}
126
127
127
- impl Listener < TcpStream > for TcpListener {
128
+ impl Listener < TcpStream , TcpAcceptor > for TcpListener {
129
+ fn listen ( self ) -> Option < TcpAcceptor > {
130
+ match ( * * self ) . listen ( ) {
131
+ Ok ( acceptor) => Some ( TcpAcceptor ( acceptor) ) ,
132
+ Err ( ioerr) => {
133
+ io_error:: cond. raise ( ioerr) ;
134
+ None
135
+ }
136
+ }
137
+ }
138
+ }
139
+
140
+ pub struct TcpAcceptor ( ~RtioTcpAcceptorObject ) ;
141
+
142
+ impl Acceptor < TcpStream > for TcpAcceptor {
128
143
fn accept ( & mut self ) -> Option < TcpStream > {
129
144
match ( * * self ) . accept ( ) {
130
145
Ok ( s) => Some ( TcpStream :: new ( s) ) ,
131
146
Err ( ioerr) => {
132
147
io_error:: cond. raise ( ioerr) ;
133
- return None ;
148
+ None
134
149
}
135
150
}
136
151
}
@@ -184,8 +199,8 @@ mod test {
184
199
let addr = next_test_ip4 ( ) ;
185
200
186
201
do spawntask {
187
- let mut listener = TcpListener :: bind ( addr) ;
188
- let mut stream = listener . accept ( ) ;
202
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
203
+ let mut stream = acceptor . accept ( ) ;
189
204
let mut buf = [ 0 ] ;
190
205
stream. read ( buf) ;
191
206
assert ! ( buf[ 0 ] == 99 ) ;
@@ -204,8 +219,8 @@ mod test {
204
219
let addr = next_test_ip6 ( ) ;
205
220
206
221
do spawntask {
207
- let mut listener = TcpListener :: bind ( addr) ;
208
- let mut stream = listener . accept ( ) ;
222
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
223
+ let mut stream = acceptor . accept ( ) ;
209
224
let mut buf = [ 0 ] ;
210
225
stream. read ( buf) ;
211
226
assert ! ( buf[ 0 ] == 99 ) ;
@@ -224,8 +239,8 @@ mod test {
224
239
let addr = next_test_ip4 ( ) ;
225
240
226
241
do spawntask {
227
- let mut listener = TcpListener :: bind ( addr) ;
228
- let mut stream = listener . accept ( ) ;
242
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
243
+ let mut stream = acceptor . accept ( ) ;
229
244
let mut buf = [ 0 ] ;
230
245
let nread = stream. read ( buf) ;
231
246
assert ! ( nread. is_none( ) ) ;
@@ -244,8 +259,8 @@ mod test {
244
259
let addr = next_test_ip6 ( ) ;
245
260
246
261
do spawntask {
247
- let mut listener = TcpListener :: bind ( addr) ;
248
- let mut stream = listener . accept ( ) ;
262
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
263
+ let mut stream = acceptor . accept ( ) ;
249
264
let mut buf = [ 0 ] ;
250
265
let nread = stream. read ( buf) ;
251
266
assert ! ( nread. is_none( ) ) ;
@@ -265,8 +280,8 @@ mod test {
265
280
let addr = next_test_ip4 ( ) ;
266
281
267
282
do spawntask {
268
- let mut listener = TcpListener :: bind ( addr) ;
269
- let mut stream = listener . accept ( ) ;
283
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
284
+ let mut stream = acceptor . accept ( ) ;
270
285
let mut buf = [ 0 ] ;
271
286
let nread = stream. read ( buf) ;
272
287
assert ! ( nread. is_none( ) ) ;
@@ -288,8 +303,8 @@ mod test {
288
303
let addr = next_test_ip6 ( ) ;
289
304
290
305
do spawntask {
291
- let mut listener = TcpListener :: bind ( addr) ;
292
- let mut stream = listener . accept ( ) ;
306
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
307
+ let mut stream = acceptor . accept ( ) ;
293
308
let mut buf = [ 0 ] ;
294
309
let nread = stream. read ( buf) ;
295
310
assert ! ( nread. is_none( ) ) ;
@@ -311,8 +326,8 @@ mod test {
311
326
let addr = next_test_ip4 ( ) ;
312
327
313
328
do spawntask {
314
- let mut listener = TcpListener :: bind ( addr) ;
315
- let mut stream = listener . accept ( ) ;
329
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
330
+ let mut stream = acceptor . accept ( ) ;
316
331
let buf = [ 0 ] ;
317
332
loop {
318
333
let mut stop = false ;
@@ -341,8 +356,8 @@ mod test {
341
356
let addr = next_test_ip6 ( ) ;
342
357
343
358
do spawntask {
344
- let mut listener = TcpListener :: bind ( addr) ;
345
- let mut stream = listener . accept ( ) ;
359
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
360
+ let mut stream = acceptor . accept ( ) ;
346
361
let buf = [ 0 ] ;
347
362
loop {
348
363
let mut stop = false ;
@@ -371,9 +386,8 @@ mod test {
371
386
let max = 10 ;
372
387
373
388
do spawntask {
374
- let mut listener = TcpListener :: bind ( addr) ;
375
- do max. times {
376
- let mut stream = listener. accept ( ) ;
389
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
390
+ for ref mut stream in acceptor. incoming ( ) . take ( max) {
377
391
let mut buf = [ 0 ] ;
378
392
stream. read ( buf) ;
379
393
assert_eq ! ( buf[ 0 ] , 99 ) ;
@@ -396,9 +410,8 @@ mod test {
396
410
let max = 10 ;
397
411
398
412
do spawntask {
399
- let mut listener = TcpListener :: bind ( addr) ;
400
- do max. times {
401
- let mut stream = listener. accept ( ) ;
413
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
414
+ for ref mut stream in acceptor. incoming ( ) . take ( max) {
402
415
let mut buf = [ 0 ] ;
403
416
stream. read ( buf) ;
404
417
assert_eq ! ( buf[ 0 ] , 99 ) ;
@@ -421,10 +434,9 @@ mod test {
421
434
static MAX : int = 10 ;
422
435
423
436
do spawntask {
424
- let mut listener = TcpListener :: bind ( addr) ;
425
- for i in range ( 0 , MAX ) {
426
- let stream = Cell :: new ( listener. accept ( ) ) ;
427
- rtdebug ! ( "accepted" ) ;
437
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
438
+ for ( i, stream) in acceptor. incoming ( ) . enumerate ( ) . take ( MAX as uint ) {
439
+ let stream = Cell :: new ( stream) ;
428
440
// Start another task to handle the connection
429
441
do spawntask {
430
442
let mut stream = stream. take ( ) ;
@@ -460,10 +472,9 @@ mod test {
460
472
static MAX : int = 10 ;
461
473
462
474
do spawntask {
463
- let mut listener = TcpListener :: bind ( addr) ;
464
- for i in range ( 0 , MAX ) {
465
- let stream = Cell :: new ( listener. accept ( ) ) ;
466
- rtdebug ! ( "accepted" ) ;
475
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
476
+ for ( i, stream) in acceptor. incoming ( ) . enumerate ( ) . take ( MAX as uint ) {
477
+ let stream = Cell :: new ( stream) ;
467
478
// Start another task to handle the connection
468
479
do spawntask {
469
480
let mut stream = stream. take ( ) ;
@@ -499,10 +510,9 @@ mod test {
499
510
static MAX : int = 10 ;
500
511
501
512
do spawntask {
502
- let mut listener = TcpListener :: bind ( addr) ;
503
- for _ in range ( 0 , MAX ) {
504
- let stream = Cell :: new ( listener. accept ( ) ) ;
505
- rtdebug ! ( "accepted" ) ;
513
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
514
+ for stream in acceptor. incoming ( ) . take ( MAX as uint ) {
515
+ let stream = Cell :: new ( stream) ;
506
516
// Start another task to handle the connection
507
517
do spawntask_later {
508
518
let mut stream = stream. take ( ) ;
@@ -537,10 +547,9 @@ mod test {
537
547
static MAX : int = 10 ;
538
548
539
549
do spawntask {
540
- let mut listener = TcpListener :: bind ( addr) ;
541
- for _ in range ( 0 , MAX ) {
542
- let stream = Cell :: new ( listener. accept ( ) ) ;
543
- rtdebug ! ( "accepted" ) ;
550
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
551
+ for stream in acceptor. incoming ( ) . take ( MAX as uint ) {
552
+ let stream = Cell :: new ( stream) ;
544
553
// Start another task to handle the connection
545
554
do spawntask_later {
546
555
let mut stream = stream. take ( ) ;
@@ -573,10 +582,7 @@ mod test {
573
582
fn socket_name ( addr : SocketAddr ) {
574
583
do run_in_newsched_task {
575
584
do spawntask {
576
- let listener = TcpListener :: bind ( addr) ;
577
-
578
- assert ! ( listener. is_some( ) ) ;
579
- let mut listener = listener. unwrap ( ) ;
585
+ let mut listener = TcpListener :: bind ( addr) . unwrap ( ) ;
580
586
581
587
// Make sure socket_name gives
582
588
// us the socket we binded to.
@@ -592,9 +598,9 @@ mod test {
592
598
fn peer_name ( addr : SocketAddr ) {
593
599
do run_in_newsched_task {
594
600
do spawntask {
595
- let mut listener = TcpListener :: bind ( addr) ;
601
+ let mut acceptor = TcpListener :: bind ( addr) . listen ( ) ;
596
602
597
- listener . accept ( ) ;
603
+ acceptor . accept ( ) ;
598
604
}
599
605
600
606
do spawntask {
0 commit comments