@@ -447,16 +447,14 @@ impl<'s, 'n: 's> Read for Socket<'s, 'n> {
447447impl < ' s , ' n : ' s > Write for Socket < ' s , ' n > {
448448 fn write ( & mut self , buf : & [ u8 ] ) -> Result < usize , Self :: Error > {
449449 loop {
450- self . network . with_mut ( |interface, device, sockets| {
451- interface. poll (
452- Instant :: from_millis ( ( self . network . current_millis_fn ) ( ) as i64 ) ,
453- device,
454- sockets,
455- )
456- } ) ;
457-
458450 let ( may_send, is_open, can_send) =
459- self . network . with_mut ( |_interface, _device, sockets| {
451+ self . network . with_mut ( |interface, device, sockets| {
452+ interface. poll (
453+ Instant :: from_millis ( ( self . network . current_millis_fn ) ( ) as i64 ) ,
454+ device,
455+ sockets,
456+ ) ;
457+
460458 let socket = sockets. get_mut :: < TcpSocket > ( self . socket_handle ) ;
461459
462460 ( socket. may_send ( ) , socket. is_open ( ) , socket. can_send ( ) )
@@ -466,50 +464,29 @@ impl<'s, 'n: 's> Write for Socket<'s, 'n> {
466464 break ;
467465 }
468466
469- if !is_open {
470- return Err ( IoError :: SocketClosed ) ;
471- }
472-
473- if !can_send {
467+ if !is_open || !can_send {
474468 return Err ( IoError :: SocketClosed ) ;
475469 }
476470 }
477471
472+ let mut written = 0 ;
478473 loop {
479- let res = self . network . with_mut ( |interface, device, sockets| {
480- interface. poll (
481- Instant :: from_millis ( ( self . network . current_millis_fn ) ( ) as i64 ) ,
482- device,
483- sockets,
484- )
485- } ) ;
474+ self . flush ( ) ?;
486475
487- if let false = res {
476+ self . network . with_mut ( |_interface, _device, sockets| {
477+ sockets
478+ . get_mut :: < TcpSocket > ( self . socket_handle )
479+ . send_slice ( & buf[ written..] )
480+ . map ( |len| written += len)
481+ . map_err ( IoError :: TcpSendError )
482+ } ) ?;
483+
484+ if written >= buf. len ( ) {
488485 break ;
489486 }
490487 }
491488
492- let res = self . network . with_mut ( |_interface, _device, sockets| {
493- let socket = sockets. get_mut :: < TcpSocket > ( self . socket_handle ) ;
494-
495- let mut written = 0 ;
496- loop {
497- match socket. send_slice ( & buf[ written..] ) {
498- Ok ( len) => {
499- written += len;
500-
501- if written >= buf. len ( ) {
502- break Ok ( written) ;
503- }
504-
505- log:: info!( "not fully written: {}" , len) ;
506- }
507- Err ( err) => break Err ( IoError :: TcpSendError ( err) ) ,
508- }
509- }
510- } ) ;
511-
512- res
489+ Ok ( written)
513490 }
514491
515492 fn flush ( & mut self ) -> Result < ( ) , Self :: Error > {
0 commit comments