@@ -132,8 +132,12 @@ pub mod link {
132132pub mod binary {
133133
134134 use std:: borrow:: Cow ;
135+ use std:: io:: ErrorKind ;
136+ use std:: ops:: DerefMut ;
137+ use std:: sync:: Arc ;
135138
136139 use serde:: { de:: DeserializeOwned , Serialize } ;
140+ use timely_communication:: allocator:: zero_copy:: bytes_slab:: { BytesRefill , BytesSlab } ;
137141
138142 use super :: { Event , EventPusher , EventIterator } ;
139143
@@ -156,30 +160,62 @@ pub mod binary {
156160 impl < T : Serialize , C : Serialize , W : :: std:: io:: Write > EventPusher < T , C > for EventWriter < T , C , W > {
157161 fn push ( & mut self , event : Event < T , C > ) {
158162 // TODO: `push` has no mechanism to report errors, so we `unwrap`.
159- :: bincode:: serialize_into ( & mut self . stream , & event) . expect ( "Event bincode/write failed" ) ;
163+ let len = :: bincode:: serialized_size ( & event) . expect ( "Event bincode failed" ) ;
164+ self . stream . write_all ( & len. to_le_bytes ( ) ) . expect ( "Event write failed" ) ;
165+ :: bincode:: serialize_into ( & mut self . stream , & event) . expect ( "Event bincode failed" ) ;
160166 }
161167 }
162168
163169 /// A Wrapper for `R: Read` implementing `EventIterator<T, D>`.
164170 pub struct EventReader < T , C , R : :: std:: io:: Read > {
165171 reader : R ,
166- decoded : Option < Event < T , C > > ,
172+ buf : BytesSlab ,
173+ phant : :: std:: marker:: PhantomData < ( T , C ) > ,
167174 }
168175
169176 impl < T , C , R : :: std:: io:: Read > EventReader < T , C , R > {
170177 /// Allocates a new `EventReader` wrapping a supplied reader.
171178 pub fn new ( r : R ) -> Self {
179+ let refill = BytesRefill {
180+ logic : Arc :: new ( |size| {
181+ Box :: new ( vec ! [ 0_u8 ; size] ) as Box < dyn DerefMut < Target = [ u8 ] > >
182+ } ) ,
183+ limit : None ,
184+ } ;
172185 Self {
173186 reader : r,
174- decoded : None ,
187+ buf : BytesSlab :: new ( 20 , refill) ,
188+ phant : :: std:: marker:: PhantomData ,
175189 }
176190 }
177191 }
178192
179193 impl < T : DeserializeOwned + Clone , C : DeserializeOwned + Clone , R : :: std:: io:: Read > EventIterator < T , C > for EventReader < T , C , R > {
180194 fn next ( & mut self ) -> Option < Cow < ' _ , Event < T , C > > > {
181- self . decoded = :: bincode:: deserialize_from ( & mut self . reader ) . ok ( ) ;
182- self . decoded . take ( ) . map ( Cow :: Owned )
195+ self . buf . ensure_capacity ( 1 ) ;
196+ // Attempt to read some more bytes into self.buffer.
197+ match self . reader . read ( self . buf . empty ( ) ) {
198+ Ok ( n) => self . buf . make_valid ( n) ,
199+ Err ( e) if e. kind ( ) == ErrorKind :: WouldBlock => { }
200+ Err ( e) => panic ! ( "read failed: {e}" ) ,
201+ } ;
202+
203+ let valid = self . buf . valid ( ) ;
204+ if valid. len ( ) >= 8 {
205+ let event_len = u64:: from_le_bytes ( [
206+ valid[ 0 ] , valid[ 1 ] , valid[ 2 ] , valid[ 3 ] , valid[ 4 ] , valid[ 5 ] , valid[ 6 ] , valid[ 7 ] ,
207+ ] ) ;
208+ let required_bytes = ( event_len + 8 ) as usize ;
209+ if valid. len ( ) >= required_bytes {
210+ let bytes = self . buf . extract ( required_bytes) ;
211+ let event = :: bincode:: deserialize ( & bytes[ 8 ..] ) . expect ( "Event decode failed" ) ;
212+ Some ( Cow :: Owned ( event) )
213+ } else {
214+ None
215+ }
216+ } else {
217+ None
218+ }
183219 }
184220 }
185221}
0 commit comments