@@ -25,11 +25,14 @@ use crate::{
25
25
socket:: option:: { SocketOption , TcpSocketOptions } ,
26
26
transport:: NetworkTransport ,
27
27
} ,
28
- poll_yield, DemiRuntime , SharedDemiRuntime , SharedObject ,
28
+ poll_yield,
29
+ types:: DEMI_SGARRAY_MAXLEN ,
30
+ DemiRuntime , SharedDemiRuntime , SharedObject ,
29
31
} ,
30
32
} ;
33
+ use :: arrayvec:: ArrayVec ;
31
34
use :: futures:: FutureExt ;
32
- use std:: {
35
+ use :: std:: {
33
36
net:: { SocketAddr , SocketAddrV4 } ,
34
37
pin:: Pin ,
35
38
} ;
@@ -244,7 +247,7 @@ impl NetworkTransport for SharedCatnapTransport {
244
247
& mut self ,
245
248
socket : & mut Self :: SocketDescriptor ,
246
249
size : usize ,
247
- ) -> Result < ( Option < SocketAddr > , DemiBuffer ) , Fail > {
250
+ ) -> Result < ( Option < SocketAddr > , ArrayVec < DemiBuffer , DEMI_SGARRAY_MAXLEN > ) , Fail > {
248
251
let mut buf: DemiBuffer = DemiBuffer :: new ( size as u16 ) ;
249
252
unsafe {
250
253
self . 0 . iocp . do_io (
@@ -265,7 +268,9 @@ impl NetworkTransport for SharedCatnapTransport {
265
268
} else {
266
269
trace ! ( "not data received" ) ;
267
270
}
268
- Ok ( ( sockaddr, buf) )
271
+ let mut result: ArrayVec < DemiBuffer , DEMI_SGARRAY_MAXLEN > = ArrayVec :: new ( ) ;
272
+ result. push ( buf) ;
273
+ Ok ( ( sockaddr, result) )
269
274
} )
270
275
}
271
276
@@ -275,40 +280,40 @@ impl NetworkTransport for SharedCatnapTransport {
275
280
async fn push (
276
281
& mut self ,
277
282
socket : & mut Self :: SocketDescriptor ,
278
- buf : & mut DemiBuffer ,
283
+ bufs : ArrayVec < DemiBuffer , DEMI_SGARRAY_MAXLEN > ,
279
284
addr : Option < SocketAddr > ,
280
285
) -> Result < ( ) , Fail > {
281
- loop {
282
- let result: Result < usize , Fail > = unsafe {
283
- self . 0 . iocp . do_io (
284
- SocketOpState :: Push ( buf. clone ( ) ) ,
285
- |state : Pin < & mut SocketOpState > , overlapped : * mut OVERLAPPED | -> Result < ( ) , Fail > {
286
- socket. start_push ( state, addr, overlapped)
287
- } ,
288
- |_: Pin < & mut SocketOpState > , result : OverlappedResult | -> Result < usize , Fail > {
289
- socket. finish_push ( result)
286
+ for mut buf in bufs {
287
+ while !buf. is_empty ( ) {
288
+ let result: Result < usize , Fail > = unsafe {
289
+ self . 0 . iocp . do_io (
290
+ SocketOpState :: Push ( buf. clone ( ) ) ,
291
+ |state : Pin < & mut SocketOpState > , overlapped : * mut OVERLAPPED | -> Result < ( ) , Fail > {
292
+ socket. start_push ( state, addr, overlapped)
293
+ } ,
294
+ |_: Pin < & mut SocketOpState > , result : OverlappedResult | -> Result < usize , Fail > {
295
+ socket. finish_push ( result)
296
+ } ,
297
+ )
298
+ }
299
+ . await ;
300
+
301
+ match result {
302
+ Ok ( nbytes) => {
303
+ trace ! ( "data pushed ({:?}/{:?} bytes)" , nbytes, buf. len( ) ) ;
304
+ buf. adjust ( nbytes) ?;
290
305
} ,
291
- )
292
- }
293
- . await ;
294
-
295
- match result {
296
- Ok ( nbytes) => {
297
- trace ! ( "data pushed ({:?}/{:?} bytes)" , nbytes, buf. len( ) ) ;
298
- buf. adjust ( nbytes) ?;
299
- if buf. is_empty ( ) {
300
- return Ok ( ( ) ) ;
301
- }
302
- } ,
303
306
304
- Err ( fail) => {
305
- if !DemiRuntime :: should_retry ( fail. errno ) {
306
- let message: String = format ! ( "push failed: {}" , fail. cause) ;
307
- return Err ( Fail :: new ( fail. errno , message. as_str ( ) ) ) ;
308
- }
309
- } ,
307
+ Err ( fail) => {
308
+ if !DemiRuntime :: should_retry ( fail. errno ) {
309
+ let message: String = format ! ( "push failed: {}" , fail. cause) ;
310
+ return Err ( Fail :: new ( fail. errno , message. as_str ( ) ) ) ;
311
+ }
312
+ } ,
313
+ }
310
314
}
311
315
}
316
+ Ok ( ( ) )
312
317
}
313
318
314
319
fn get_runtime ( & self ) -> & SharedDemiRuntime {
0 commit comments