Skip to content

Commit 968f7f5

Browse files
author
Eric Reed
committed
Changed methods on UDP sockets and TCP/UDP watchers to &mut self to reflect that libuv may change the underlying handle.
1 parent 0d04aa7 commit 968f7f5

File tree

3 files changed

+65
-64
lines changed

3 files changed

+65
-64
lines changed

src/libstd/rt/io/net/udp.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl UdpSocket {
3030
}
3131
}
3232

33-
pub fn recvfrom(&self, buf: &mut [u8]) -> Option<(uint, IpAddr)> {
33+
pub fn recvfrom(&mut self, buf: &mut [u8]) -> Option<(uint, IpAddr)> {
3434
match (**self).recvfrom(buf) {
3535
Ok((nread, src)) => Some((nread, src)),
3636
Err(ioerr) => {
@@ -43,7 +43,7 @@ impl UdpSocket {
4343
}
4444
}
4545

46-
pub fn sendto(&self, buf: &[u8], dst: IpAddr) {
46+
pub fn sendto(&mut self, buf: &[u8], dst: IpAddr) {
4747
match (**self).sendto(buf, dst) {
4848
Ok(_) => (),
4949
Err(ioerr) => io_error::cond.raise(ioerr),
@@ -61,16 +61,17 @@ pub struct UdpStream {
6161
}
6262

6363
impl UdpStream {
64-
pub fn as_socket<T>(&self, f: &fn(&UdpSocket) -> T) -> T { f(&self.socket) }
64+
pub fn as_socket<T>(&mut self, f: &fn(&mut UdpSocket) -> T) -> T { f(&mut self.socket) }
6565

6666
pub fn disconnect(self) -> UdpSocket { self.socket }
6767
}
6868

6969
impl Reader for UdpStream {
7070
fn read(&mut self, buf: &mut [u8]) -> Option<uint> {
71+
let peer = self.connectedTo;
7172
do self.as_socket |sock| {
7273
match sock.recvfrom(buf) {
73-
Some((_nread, src)) if src != self.connectedTo => Some(0),
74+
Some((_nread, src)) if src != peer => Some(0),
7475
Some((nread, _src)) => Some(nread),
7576
None => None,
7677
}
@@ -122,7 +123,7 @@ mod test {
122123

123124
do spawntask_immediately {
124125
match UdpSocket::bind(server_ip) {
125-
Some(server) => {
126+
Some(ref mut server) => {
126127
let mut buf = [0];
127128
match server.recvfrom(buf) {
128129
Some((nread, src)) => {
@@ -139,7 +140,7 @@ mod test {
139140

140141
do spawntask_immediately {
141142
match UdpSocket::bind(client_ip) {
142-
Some(client) => client.sendto([99], server_ip),
143+
Some(ref mut client) => client.sendto([99], server_ip),
143144
None => fail!()
144145
}
145146
}
@@ -154,7 +155,7 @@ mod test {
154155

155156
do spawntask_immediately {
156157
match UdpSocket::bind(server_ip) {
157-
Some(server) => {
158+
Some(ref mut server) => {
158159
let mut buf = [0];
159160
match server.recvfrom(buf) {
160161
Some((nread, src)) => {
@@ -171,7 +172,7 @@ mod test {
171172

172173
do spawntask_immediately {
173174
match UdpSocket::bind(client_ip) {
174-
Some(client) => client.sendto([99], server_ip),
175+
Some(ref mut client) => client.sendto([99], server_ip),
175176
None => fail!()
176177
}
177178
}

src/libstd/rt/rtio.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,37 +50,37 @@ pub trait IoFactory {
5050

5151
pub trait RtioTcpListener : RtioSocket {
5252
fn accept(&mut self) -> Result<~RtioTcpStreamObject, IoError>;
53-
fn accept_simultaneously(&self);
54-
fn dont_accept_simultaneously(&self);
53+
fn accept_simultaneously(&mut self);
54+
fn dont_accept_simultaneously(&mut self);
5555
}
5656

5757
pub trait RtioTcpStream : RtioSocket {
58-
fn read(&self, buf: &mut [u8]) -> Result<uint, IoError>;
59-
fn write(&self, buf: &[u8]) -> Result<(), IoError>;
60-
fn peer_name(&self) -> IpAddr;
61-
fn control_congestion(&self);
62-
fn nodelay(&self);
63-
fn keepalive(&self, delay_in_seconds: uint);
64-
fn letdie(&self);
58+
fn read(&mut self, buf: &mut [u8]) -> Result<uint, IoError>;
59+
fn write(&mut self, buf: &[u8]) -> Result<(), IoError>;
60+
fn peer_name(&mut self) -> IpAddr;
61+
fn control_congestion(&mut self);
62+
fn nodelay(&mut self);
63+
fn keepalive(&mut self, delay_in_seconds: uint);
64+
fn letdie(&mut self);
6565
}
6666

6767
pub trait RtioSocket {
68-
fn socket_name(&self) -> IpAddr;
68+
fn socket_name(&mut self) -> IpAddr;
6969
}
7070

7171
pub trait RtioUdpSocket : RtioSocket {
72-
fn recvfrom(&self, buf: &mut [u8]) -> Result<(uint, IpAddr), IoError>;
73-
fn sendto(&self, buf: &[u8], dst: IpAddr) -> Result<(), IoError>;
72+
fn recvfrom(&mut self, buf: &mut [u8]) -> Result<(uint, IpAddr), IoError>;
73+
fn sendto(&mut self, buf: &[u8], dst: IpAddr) -> Result<(), IoError>;
7474

75-
fn join_multicast(&self, multi: IpAddr);
76-
fn leave_multicast(&self, multi: IpAddr);
75+
fn join_multicast(&mut self, multi: IpAddr);
76+
fn leave_multicast(&mut self, multi: IpAddr);
7777

78-
fn loop_multicast_locally(&self);
79-
fn dont_loop_multicast_locally(&self);
78+
fn loop_multicast_locally(&mut self);
79+
fn dont_loop_multicast_locally(&mut self);
8080

81-
fn multicast_time_to_live(&self, ttl: int);
82-
fn time_to_live(&self, ttl: int);
81+
fn multicast_time_to_live(&mut self, ttl: int);
82+
fn time_to_live(&mut self, ttl: int);
8383

84-
fn hear_broadcasts(&self);
85-
fn ignore_broadcasts(&self);
84+
fn hear_broadcasts(&mut self);
85+
fn ignore_broadcasts(&mut self);
8686
}

src/libstd/rt/uv/uvio.rs

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ impl Drop for UvTcpListener {
317317

318318
impl RtioSocket for UvTcpListener {
319319
// XXX implement
320-
fn socket_name(&self) -> IpAddr { fail!(); }
320+
fn socket_name(&mut self) -> IpAddr { fail!(); }
321321
}
322322

323323
impl RtioTcpListener for UvTcpListener {
@@ -357,8 +357,8 @@ impl RtioTcpListener for UvTcpListener {
357357
}
358358

359359
// XXX implement
360-
fn accept_simultaneously(&self) { fail!(); }
361-
fn dont_accept_simultaneously(&self) { fail!(); }
360+
fn accept_simultaneously(&mut self) { fail!(); }
361+
fn dont_accept_simultaneously(&mut self) { fail!(); }
362362
}
363363

364364
// FIXME #6090: Prefer newtype structs but Drop doesn't work
@@ -380,11 +380,11 @@ impl Drop for UvTcpStream {
380380

381381
impl RtioSocket for UvTcpStream {
382382
// XXX implement
383-
fn socket_name(&self) -> IpAddr { fail!(); }
383+
fn socket_name(&mut self) -> IpAddr { fail!(); }
384384
}
385385

386386
impl RtioTcpStream for UvTcpStream {
387-
fn read(&self, buf: &mut [u8]) -> Result<uint, IoError> {
387+
fn read(&mut self, buf: &mut [u8]) -> Result<uint, IoError> {
388388
let result_cell = Cell::new_empty();
389389
let result_cell_ptr: *Cell<Result<uint, IoError>> = &result_cell;
390390

@@ -427,7 +427,7 @@ impl RtioTcpStream for UvTcpStream {
427427
return result_cell.take();
428428
}
429429

430-
fn write(&self, buf: &[u8]) -> Result<(), IoError> {
430+
fn write(&mut self, buf: &[u8]) -> Result<(), IoError> {
431431
let result_cell = Cell::new_empty();
432432
let result_cell_ptr: *Cell<Result<(), IoError>> = &result_cell;
433433
let scheduler = Local::take::<Scheduler>();
@@ -456,11 +456,11 @@ impl RtioTcpStream for UvTcpStream {
456456
}
457457

458458
// XXX implement
459-
fn peer_name(&self) -> IpAddr { fail!(); }
460-
fn control_congestion(&self) { fail!(); }
461-
fn nodelay(&self) { fail!(); }
462-
fn keepalive(&self, _delay_in_seconds: uint) { fail!(); }
463-
fn letdie(&self) { fail!(); }
459+
fn peer_name(&mut self) -> IpAddr { fail!(); }
460+
fn control_congestion(&mut self) { fail!(); }
461+
fn nodelay(&mut self) { fail!(); }
462+
fn keepalive(&mut self, _delay_in_seconds: uint) { fail!(); }
463+
fn letdie(&mut self) { fail!(); }
464464
}
465465

466466
pub struct UvUdpSocket(UdpWatcher);
@@ -481,11 +481,11 @@ impl Drop for UvUdpSocket {
481481

482482
impl RtioSocket for UvUdpSocket {
483483
// XXX implement
484-
fn socket_name(&self) -> IpAddr { fail!(); }
484+
fn socket_name(&mut self) -> IpAddr { fail!(); }
485485
}
486486

487487
impl RtioUdpSocket for UvUdpSocket {
488-
fn recvfrom(&self, buf: &mut [u8]) -> Result<(uint, IpAddr), IoError> {
488+
fn recvfrom(&mut self, buf: &mut [u8]) -> Result<(uint, IpAddr), IoError> {
489489
let result_cell = Cell::new_empty();
490490
let result_cell_ptr: *Cell<Result<(uint, IpAddr), IoError>> = &result_cell;
491491

@@ -521,7 +521,7 @@ impl RtioUdpSocket for UvUdpSocket {
521521
return result_cell.take();
522522
}
523523

524-
fn sendto(&self, buf: &[u8], dst: IpAddr) -> Result<(), IoError> {
524+
fn sendto(&mut self, buf: &[u8], dst: IpAddr) -> Result<(), IoError> {
525525
let result_cell = Cell::new_empty();
526526
let result_cell_ptr: *Cell<Result<(), IoError>> = &result_cell;
527527
let scheduler = Local::take::<Scheduler>();
@@ -549,17 +549,17 @@ impl RtioUdpSocket for UvUdpSocket {
549549
}
550550

551551
// XXX implement
552-
fn join_multicast(&self, _multi: IpAddr) { fail!(); }
553-
fn leave_multicast(&self, _multi: IpAddr) { fail!(); }
552+
fn join_multicast(&mut self, _multi: IpAddr) { fail!(); }
553+
fn leave_multicast(&mut self, _multi: IpAddr) { fail!(); }
554554

555-
fn loop_multicast_locally(&self) { fail!(); }
556-
fn dont_loop_multicast_locally(&self) { fail!(); }
555+
fn loop_multicast_locally(&mut self) { fail!(); }
556+
fn dont_loop_multicast_locally(&mut self) { fail!(); }
557557

558-
fn multicast_time_to_live(&self, _ttl: int) { fail!(); }
559-
fn time_to_live(&self, _ttl: int) { fail!(); }
558+
fn multicast_time_to_live(&mut self, _ttl: int) { fail!(); }
559+
fn time_to_live(&mut self, _ttl: int) { fail!(); }
560560

561-
fn hear_broadcasts(&self) { fail!(); }
562-
fn ignore_broadcasts(&self) { fail!(); }
561+
fn hear_broadcasts(&mut self) { fail!(); }
562+
fn ignore_broadcasts(&mut self) { fail!(); }
563563
}
564564

565565
#[test]
@@ -596,7 +596,7 @@ fn test_simple_tcp_server_and_client() {
596596
unsafe {
597597
let io = Local::unsafe_borrow::<IoFactoryObject>();
598598
let mut listener = (*io).tcp_bind(addr).unwrap();
599-
let stream = listener.accept().unwrap();
599+
let mut stream = listener.accept().unwrap();
600600
let mut buf = [0, .. 2048];
601601
let nread = stream.read(buf).unwrap();
602602
assert_eq!(nread, 8);
@@ -610,7 +610,7 @@ fn test_simple_tcp_server_and_client() {
610610
do spawntask_immediately {
611611
unsafe {
612612
let io = Local::unsafe_borrow::<IoFactoryObject>();
613-
let stream = (*io).tcp_connect(addr).unwrap();
613+
let mut stream = (*io).tcp_connect(addr).unwrap();
614614
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
615615
}
616616
}
@@ -626,7 +626,7 @@ fn test_simple_udp_server_and_client() {
626626
do spawntask_immediately {
627627
unsafe {
628628
let io = Local::unsafe_borrow::<IoFactoryObject>();
629-
let server_socket = (*io).udp_bind(server_addr).unwrap();
629+
let mut server_socket = (*io).udp_bind(server_addr).unwrap();
630630
let mut buf = [0, .. 2048];
631631
let (nread,src) = server_socket.recvfrom(buf).unwrap();
632632
assert_eq!(nread, 8);
@@ -641,7 +641,7 @@ fn test_simple_udp_server_and_client() {
641641
do spawntask_immediately {
642642
unsafe {
643643
let io = Local::unsafe_borrow::<IoFactoryObject>();
644-
let client_socket = (*io).udp_bind(client_addr).unwrap();
644+
let mut client_socket = (*io).udp_bind(client_addr).unwrap();
645645
client_socket.sendto([0, 1, 2, 3, 4, 5, 6, 7], server_addr);
646646
}
647647
}
@@ -656,7 +656,7 @@ fn test_read_and_block() {
656656
do spawntask_immediately {
657657
let io = unsafe { Local::unsafe_borrow::<IoFactoryObject>() };
658658
let mut listener = unsafe { (*io).tcp_bind(addr).unwrap() };
659-
let stream = listener.accept().unwrap();
659+
let mut stream = listener.accept().unwrap();
660660
let mut buf = [0, .. 2048];
661661

662662
let expected = 32;
@@ -689,7 +689,7 @@ fn test_read_and_block() {
689689
do spawntask_immediately {
690690
unsafe {
691691
let io = Local::unsafe_borrow::<IoFactoryObject>();
692-
let stream = (*io).tcp_connect(addr).unwrap();
692+
let mut stream = (*io).tcp_connect(addr).unwrap();
693693
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
694694
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
695695
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
@@ -710,7 +710,7 @@ fn test_read_read_read() {
710710
unsafe {
711711
let io = Local::unsafe_borrow::<IoFactoryObject>();
712712
let mut listener = (*io).tcp_bind(addr).unwrap();
713-
let stream = listener.accept().unwrap();
713+
let mut stream = listener.accept().unwrap();
714714
let buf = [1, .. 2048];
715715
let mut total_bytes_written = 0;
716716
while total_bytes_written < MAX {
@@ -723,7 +723,7 @@ fn test_read_read_read() {
723723
do spawntask_immediately {
724724
unsafe {
725725
let io = Local::unsafe_borrow::<IoFactoryObject>();
726-
let stream = (*io).tcp_connect(addr).unwrap();
726+
let mut stream = (*io).tcp_connect(addr).unwrap();
727727
let mut buf = [0, .. 2048];
728728
let mut total_bytes_read = 0;
729729
while total_bytes_read < MAX {
@@ -749,7 +749,7 @@ fn test_udp_twice() {
749749
do spawntask_immediately {
750750
unsafe {
751751
let io = Local::unsafe_borrow::<IoFactoryObject>();
752-
let client = (*io).udp_bind(client_addr).unwrap();
752+
let mut client = (*io).udp_bind(client_addr).unwrap();
753753
assert!(client.sendto([1], server_addr).is_ok());
754754
assert!(client.sendto([2], server_addr).is_ok());
755755
}
@@ -758,7 +758,7 @@ fn test_udp_twice() {
758758
do spawntask_immediately {
759759
unsafe {
760760
let io = Local::unsafe_borrow::<IoFactoryObject>();
761-
let server = (*io).udp_bind(server_addr).unwrap();
761+
let mut server = (*io).udp_bind(server_addr).unwrap();
762762
let mut buf1 = [0];
763763
let mut buf2 = [0];
764764
let (nread1, src1) = server.recvfrom(buf1).unwrap();
@@ -786,8 +786,8 @@ fn test_udp_many_read() {
786786
do spawntask_immediately {
787787
unsafe {
788788
let io = Local::unsafe_borrow::<IoFactoryObject>();
789-
let server_out = (*io).udp_bind(server_out_addr).unwrap();
790-
let server_in = (*io).udp_bind(server_in_addr).unwrap();
789+
let mut server_out = (*io).udp_bind(server_out_addr).unwrap();
790+
let mut server_in = (*io).udp_bind(server_in_addr).unwrap();
791791
let msg = [1, .. 2048];
792792
let mut total_bytes_sent = 0;
793793
let mut buf = [1];
@@ -809,8 +809,8 @@ fn test_udp_many_read() {
809809
do spawntask_immediately {
810810
unsafe {
811811
let io = Local::unsafe_borrow::<IoFactoryObject>();
812-
let client_out = (*io).udp_bind(client_out_addr).unwrap();
813-
let client_in = (*io).udp_bind(client_in_addr).unwrap();
812+
let mut client_out = (*io).udp_bind(client_out_addr).unwrap();
813+
let mut client_in = (*io).udp_bind(client_in_addr).unwrap();
814814
let mut total_bytes_recv = 0;
815815
let mut buf = [0, .. 2048];
816816
while total_bytes_recv < MAX {

0 commit comments

Comments
 (0)