@@ -25,7 +25,9 @@ pub use crate::sys::op::{
2525 WriteVectored , WriteVectoredAt ,
2626} ;
2727#[ cfg( io_uring) ]
28- pub use crate :: sys:: op:: { ReadManaged , ReadManagedAt , RecvFromManaged , RecvManaged } ;
28+ pub use crate :: sys:: op:: {
29+ ReadManaged , ReadManagedAt , ReadMulti , ReadMultiAt , RecvFromManaged , RecvManaged , RecvMulti ,
30+ } ;
2931use crate :: { Extra , OwnedFd , SharedFd , TakeBuffer , sys:: aio:: * } ;
3032
3133/// Trait to update the buffer length inside the [`BufResult`].
@@ -177,6 +179,24 @@ impl<T: TakeBuffer> ResultTakeBuffer for (BufResult<usize, T>, Extra) {
177179 }
178180}
179181
182+ impl ResultTakeBuffer for BufResult < usize , Extra > {
183+ type Buffer < ' a > = crate :: BorrowedBuffer < ' a > ;
184+ type BufferPool = crate :: BufferPool ;
185+
186+ fn take_buffer ( self , pool : & Self :: BufferPool ) -> io:: Result < Self :: Buffer < ' _ > > {
187+ #[ cfg( io_uring) ]
188+ {
189+ let BufResult ( result, extra) = self ;
190+ crate :: sys:: take_buffer ( pool, result, extra. buffer_id ( ) ?)
191+ }
192+ #[ cfg( not( io_uring) ) ]
193+ {
194+ let _pool = pool;
195+ unreachable ! ( "take_buffer should not be called for non-io-uring ops" )
196+ }
197+ }
198+ }
199+
180200pin_project ! {
181201 /// Spawn a blocking function in the thread pool.
182202 pub struct Asyncify <F , D > {
@@ -477,6 +497,21 @@ pub(crate) mod managed {
477497 use super :: { Read , ReadAt , Recv , RecvFrom } ;
478498 use crate :: { AsFd , BorrowedBuffer , BufferPool , OwnedBuffer , TakeBuffer } ;
479499
500+ fn take_buffer (
501+ slice : OwnedBuffer ,
502+ buffer_pool : & BufferPool ,
503+ result : io:: Result < usize > ,
504+ ) -> io:: Result < BorrowedBuffer < ' _ > > {
505+ let result = result?;
506+ #[ cfg( fusion) ]
507+ let buffer_pool = buffer_pool. as_poll ( ) ;
508+ // SAFETY: result is valid
509+ let res = unsafe { buffer_pool. create_proxy ( slice, result) } ;
510+ #[ cfg( fusion) ]
511+ let res = BorrowedBuffer :: new_poll ( res) ;
512+ Ok ( res)
513+ }
514+
480515 pin_project ! {
481516 /// Read a file at specified position into managed buffer.
482517 pub struct ReadManagedAt <S > {
@@ -506,15 +541,7 @@ pub(crate) mod managed {
506541 result : io:: Result < usize > ,
507542 _: u16 ,
508543 ) -> io:: Result < BorrowedBuffer < ' _ > > {
509- let result = result?;
510- #[ cfg( fusion) ]
511- let buffer_pool = buffer_pool. as_poll ( ) ;
512- let slice = self . op . into_inner ( ) ;
513- // SAFETY: result is valid
514- let res = unsafe { buffer_pool. create_proxy ( slice, result) } ;
515- #[ cfg( fusion) ]
516- let res = BorrowedBuffer :: new_poll ( res) ;
517- Ok ( res)
544+ take_buffer ( self . op . into_inner ( ) , buffer_pool, result)
518545 }
519546 }
520547
@@ -547,15 +574,7 @@ pub(crate) mod managed {
547574 result : io:: Result < usize > ,
548575 _: u16 ,
549576 ) -> io:: Result < Self :: Buffer < ' _ > > {
550- let result = result?;
551- #[ cfg( fusion) ]
552- let buffer_pool = buffer_pool. as_poll ( ) ;
553- let slice = self . op . into_inner ( ) ;
554- // SAFETY: result is valid
555- let res = unsafe { buffer_pool. create_proxy ( slice, result) } ;
556- #[ cfg( fusion) ]
557- let res = BorrowedBuffer :: new_poll ( res) ;
558- Ok ( res)
577+ take_buffer ( self . op . into_inner ( ) , buffer_pool, result)
559578 }
560579 }
561580
@@ -591,15 +610,7 @@ pub(crate) mod managed {
591610 result : io:: Result < usize > ,
592611 _: u16 ,
593612 ) -> io:: Result < Self :: Buffer < ' _ > > {
594- let result = result?;
595- #[ cfg( fusion) ]
596- let buffer_pool = buffer_pool. as_poll ( ) ;
597- let slice = self . op . into_inner ( ) ;
598- // SAFETY: result is valid
599- let res = unsafe { buffer_pool. create_proxy ( slice, result) } ;
600- #[ cfg( fusion) ]
601- let res = BorrowedBuffer :: new_poll ( res) ;
602- Ok ( res)
613+ take_buffer ( self . op . into_inner ( ) , buffer_pool, result)
603614 }
604615 }
605616
@@ -644,6 +655,13 @@ pub(crate) mod managed {
644655 Ok ( ( res, addr) )
645656 }
646657 }
658+
659+ /// Read a file at specified position into multiple managed buffers.
660+ pub type ReadMultiAt < S > = ReadManagedAt < S > ;
661+ /// Read a file into multiple managed buffers.
662+ pub type ReadMulti < S > = ReadManaged < S > ;
663+ /// Receive data from remote into multiple managed buffers.
664+ pub type RecvMulti < S > = RecvManaged < S > ;
647665}
648666
649667#[ cfg( not( io_uring) ) ]
0 commit comments