@@ -15,7 +15,7 @@ use cell::Cell;
15
15
use cast;
16
16
use cast:: transmute;
17
17
use clone:: Clone ;
18
- use libc:: c_void;
18
+ use libc:: { c_int , c_uint , c_void} ;
19
19
use rt:: io:: IoError ;
20
20
use rt:: io:: net:: ip:: IpAddr ;
21
21
use rt:: uv:: * ;
@@ -404,9 +404,27 @@ impl RtioTcpListener for UvTcpListener {
404
404
return self . incoming_streams . recv ( ) ;
405
405
}
406
406
407
- // XXX implement
408
- fn accept_simultaneously ( & mut self ) { fail ! ( ) ; }
409
- fn dont_accept_simultaneously ( & mut self ) { fail ! ( ) ; }
407
+ fn accept_simultaneously ( & mut self ) -> Result < ( ) , IoError > {
408
+ let r = unsafe {
409
+ uvll:: rust_uv_tcp_simultaneous_accepts ( self . watcher . native_handle ( ) , 1 as c_int )
410
+ } ;
411
+
412
+ match status_to_maybe_uv_error ( self . watcher , r) {
413
+ Some ( err) => Err ( uv_error_to_io_error ( err) ) ,
414
+ None => Ok ( ( ) )
415
+ }
416
+ }
417
+
418
+ fn dont_accept_simultaneously ( & mut self ) -> Result < ( ) , IoError > {
419
+ let r = unsafe {
420
+ uvll:: rust_uv_tcp_simultaneous_accepts ( self . watcher . native_handle ( ) , 0 as c_int )
421
+ } ;
422
+
423
+ match status_to_maybe_uv_error ( self . watcher , r) {
424
+ Some ( err) => Err ( uv_error_to_io_error ( err) ) ,
425
+ None => Ok ( ( ) )
426
+ }
427
+ }
410
428
}
411
429
412
430
pub struct UvTcpStream ( TcpWatcher ) ;
@@ -507,11 +525,50 @@ impl RtioTcpStream for UvTcpStream {
507
525
socket_name ( TcpPeer , * * self )
508
526
}
509
527
510
- // XXX implement
511
- fn control_congestion ( & mut self ) { fail ! ( ) ; }
512
- fn nodelay ( & mut self ) { fail ! ( ) ; }
513
- fn keepalive ( & mut self , _delay_in_seconds : uint ) { fail ! ( ) ; }
514
- fn letdie ( & mut self ) { fail ! ( ) ; }
528
+ fn control_congestion ( & mut self ) -> Result < ( ) , IoError > {
529
+ let r = unsafe {
530
+ uvll:: rust_uv_tcp_nodelay ( self . native_handle ( ) , 0 as c_int )
531
+ } ;
532
+
533
+ match status_to_maybe_uv_error ( * * self , r) {
534
+ Some ( err) => Err ( uv_error_to_io_error ( err) ) ,
535
+ None => Ok ( ( ) )
536
+ }
537
+ }
538
+
539
+ fn nodelay ( & mut self ) -> Result < ( ) , IoError > {
540
+ let r = unsafe {
541
+ uvll:: rust_uv_tcp_nodelay ( self . native_handle ( ) , 1 as c_int )
542
+ } ;
543
+
544
+ match status_to_maybe_uv_error ( * * self , r) {
545
+ Some ( err) => Err ( uv_error_to_io_error ( err) ) ,
546
+ None => Ok ( ( ) )
547
+ }
548
+ }
549
+
550
+ fn keepalive ( & mut self , delay_in_seconds : uint ) -> Result < ( ) , IoError > {
551
+ let r = unsafe {
552
+ uvll:: rust_uv_tcp_keepalive ( self . native_handle ( ) , 1 as c_int ,
553
+ delay_in_seconds as c_uint )
554
+ } ;
555
+
556
+ match status_to_maybe_uv_error ( * * self , r) {
557
+ Some ( err) => Err ( uv_error_to_io_error ( err) ) ,
558
+ None => Ok ( ( ) )
559
+ }
560
+ }
561
+
562
+ fn letdie ( & mut self ) -> Result < ( ) , IoError > {
563
+ let r = unsafe {
564
+ uvll:: rust_uv_tcp_keepalive ( self . native_handle ( ) , 0 as c_int , 0 as c_uint )
565
+ } ;
566
+
567
+ match status_to_maybe_uv_error ( * * self , r) {
568
+ Some ( err) => Err ( uv_error_to_io_error ( err) ) ,
569
+ None => Ok ( ( ) )
570
+ }
571
+ }
515
572
}
516
573
517
574
pub struct UvUdpSocket ( UdpWatcher ) ;
0 commit comments