@@ -13,7 +13,6 @@ pub mod packed;
13
13
pub mod split;
14
14
15
15
use alloc:: boxed:: Box ;
16
- use alloc:: collections:: vec_deque:: VecDeque ;
17
16
use alloc:: vec:: Vec ;
18
17
use core:: any:: Any ;
19
18
use core:: mem:: MaybeUninit ;
@@ -402,7 +401,7 @@ pub struct AvailBufferToken {
402
401
}
403
402
404
403
pub ( crate ) struct UsedDeviceWritableBuffer {
405
- elems : VecDeque < BufferElem > ,
404
+ elems : SmallVec < [ BufferElem ; 2 ] > ,
406
405
remaining_written_len : u32 ,
407
406
}
408
407
@@ -415,26 +414,35 @@ impl UsedDeviceWritableBuffer {
415
414
return None ;
416
415
}
417
416
418
- let elem = self . elems . pop_front ( ) ?;
417
+ // May panic, but we have written data remaining so there should always be an item
418
+ let elem = self . elems . remove ( 0 ) ;
419
+
419
420
if let BufferElem :: Sized ( sized) = elem {
420
421
match sized. downcast :: < MaybeUninit < T > > ( ) {
421
422
Ok ( cast) => {
422
423
self . remaining_written_len -= u32:: try_from ( size_of :: < T > ( ) ) . unwrap ( ) ;
423
424
Some ( unsafe { cast. assume_init ( ) } )
424
425
}
425
426
Err ( sized) => {
426
- self . elems . push_front ( BufferElem :: Sized ( sized) ) ;
427
+ // Unlikely and wrong usage, we should not optimize for this case
428
+ self . elems . insert ( 0 , BufferElem :: Sized ( sized) ) ;
427
429
None
428
430
}
429
431
}
430
432
} else {
431
- self . elems . push_front ( elem) ;
433
+ // Unlikely and wrong usage, we should not optimize for this case
434
+ self . elems . insert ( 0 , elem) ;
432
435
None
433
436
}
434
437
}
435
438
436
439
pub fn pop_front_vec ( & mut self ) -> Option < Vec < u8 , DeviceAlloc > > {
437
- let elem = self . elems . pop_front ( ) ?;
440
+ if self . elems . is_empty ( ) {
441
+ return None ;
442
+ }
443
+
444
+ let elem = self . elems . remove ( 0 ) ;
445
+
438
446
if let BufferElem :: Vector ( mut vector) = elem {
439
447
let new_len = u32:: min (
440
448
vector. capacity ( ) . try_into ( ) . unwrap ( ) ,
@@ -444,7 +452,8 @@ impl UsedDeviceWritableBuffer {
444
452
unsafe { vector. set_len ( new_len. try_into ( ) . unwrap ( ) ) } ;
445
453
Some ( vector)
446
454
} else {
447
- self . elems . push_front ( elem) ;
455
+ // Unlikely and wrong usage, we should not optimize for this case
456
+ self . elems . insert ( 0 , elem) ;
448
457
None
449
458
}
450
459
}
@@ -460,7 +469,7 @@ impl UsedBufferToken {
460
469
Self {
461
470
send_buff : tkn. send_buff ,
462
471
used_recv_buff : UsedDeviceWritableBuffer {
463
- elems : tkn. recv_buff . into_vec ( ) . into ( ) ,
472
+ elems : tkn. recv_buff ,
464
473
remaining_written_len : written_len,
465
474
} ,
466
475
}
0 commit comments