@@ -26,24 +26,10 @@ pub struct AsyncWriteTyped<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwne
26
26
27
27
#[ derive( Debug ) ]
28
28
pub ( crate ) enum AsyncWriteState {
29
- WritingVersion {
30
- version : [ u8 ; 8 ] ,
31
- len_sent : usize ,
32
- } ,
29
+ WritingVersion { version : [ u8 ; 8 ] , len_sent : usize } ,
33
30
WritingChecksumEnabled ,
34
31
Idle ,
35
- WritingLen {
36
- current_len : [ u8 ; 9 ] ,
37
- len_to_be_sent : usize ,
38
- len_sent : usize ,
39
- } ,
40
- WritingValue {
41
- bytes_sent : usize ,
42
- } ,
43
- WritingChecksum {
44
- checksum : [ u8 ; 8 ] ,
45
- len_sent : usize ,
46
- } ,
32
+ WritingValue { bytes_sent : usize } ,
47
33
Closing ,
48
34
Closed ,
49
35
}
@@ -163,55 +149,38 @@ impl<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncWriteT
163
149
AsyncWriteState :: Idle => {
164
150
if let Some ( item) = primed_values. pop_back ( ) {
165
151
write_buffer. clear ( ) ;
166
- crate :: bincode_options ( size_limit)
167
- . serialize_into ( & mut * write_buffer , & item)
152
+ let length = crate :: bincode_options ( size_limit)
153
+ . serialized_size ( & item)
168
154
. map_err ( Error :: Bincode ) ?;
169
- if write_buffer . len ( ) as u64 > size_limit {
155
+ if length > size_limit {
170
156
return Poll :: Ready ( Err ( Error :: SentMessageTooLarge ) ) ;
171
157
}
172
- let ( new_current_len, to_be_sent) = if write_buffer. is_empty ( ) {
173
- ( [ ZST_MARKER , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] , 1 )
174
- } else if write_buffer. len ( ) < U16_MARKER as usize {
175
- let bytes = ( write_buffer. len ( ) as u8 ) . to_le_bytes ( ) ;
176
- ( [ bytes[ 0 ] , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] , 1 )
177
- } else if ( write_buffer. len ( ) as u64 ) < 2_u64 . pow ( 16 ) {
178
- let bytes = ( write_buffer. len ( ) as u16 ) . to_le_bytes ( ) ;
179
- ( [ U16_MARKER , bytes[ 0 ] , bytes[ 1 ] , 0 , 0 , 0 , 0 , 0 , 0 ] , 3 )
180
- } else if ( write_buffer. len ( ) as u64 ) < 2_u64 . pow ( 32 ) {
181
- let bytes = ( write_buffer. len ( ) as u32 ) . to_le_bytes ( ) ;
182
- (
183
- [
184
- U32_MARKER , bytes[ 0 ] , bytes[ 1 ] , bytes[ 2 ] , bytes[ 3 ] , 0 , 0 , 0 , 0 ,
185
- ] ,
186
- 5 ,
187
- )
158
+ if length == 0 {
159
+ write_buffer. push ( ZST_MARKER ) ;
160
+ } else if length < U16_MARKER as u64 {
161
+ write_buffer. extend ( ( length as u8 ) . to_le_bytes ( ) ) ;
162
+ } else if length < 2_u64 . pow ( 16 ) {
163
+ write_buffer. push ( U16_MARKER ) ;
164
+ write_buffer. extend ( ( length as u16 ) . to_le_bytes ( ) ) ;
165
+ } else if length < 2_u64 . pow ( 32 ) {
166
+ write_buffer. push ( U32_MARKER ) ;
167
+ write_buffer. extend ( ( length as u32 ) . to_le_bytes ( ) ) ;
188
168
} else {
189
- let bytes = ( write_buffer. len ( ) as u64 ) . to_le_bytes ( ) ;
190
- (
191
- [
192
- U64_MARKER , bytes[ 0 ] , bytes[ 1 ] , bytes[ 2 ] , bytes[ 3 ] , bytes[ 4 ] ,
193
- bytes[ 5 ] , bytes[ 6 ] , bytes[ 7 ] ,
194
- ] ,
195
- 9 ,
196
- )
197
- } ;
198
- * state = AsyncWriteState :: WritingLen {
199
- current_len : new_current_len,
200
- len_to_be_sent : to_be_sent,
201
- len_sent : 0 ,
202
- } ;
203
- let len = futures_core:: ready!(
204
- Pin :: new( & mut * raw) . poll_write( cx, & new_current_len[ 0 ..to_be_sent] )
205
- ) ?;
206
- * state = if len == to_be_sent {
207
- AsyncWriteState :: WritingValue { bytes_sent : 0 }
208
- } else {
209
- AsyncWriteState :: WritingLen {
210
- current_len : new_current_len,
211
- len_to_be_sent : to_be_sent,
212
- len_sent : len,
213
- }
214
- } ;
169
+ write_buffer. push ( U64_MARKER ) ;
170
+ write_buffer. extend ( length. to_le_bytes ( ) ) ;
171
+ }
172
+ // Save the length... of the length value.
173
+ let length_length = write_buffer. len ( ) ;
174
+ crate :: bincode_options ( size_limit)
175
+ . serialize_into ( & mut * write_buffer, & item)
176
+ . map_err ( Error :: Bincode ) ?;
177
+ if checksum_enabled {
178
+ let mut hasher = SipHasher :: new ( ) ;
179
+ hasher. write ( & write_buffer[ length_length..] ) ;
180
+ let checksum = hasher. finish ( ) ;
181
+ write_buffer. extend ( checksum. to_le_bytes ( ) ) ;
182
+ }
183
+ * state = AsyncWriteState :: WritingValue { bytes_sent : 0 } ;
215
184
continue ;
216
185
} else if closing {
217
186
* state = AsyncWriteState :: Closing ;
@@ -220,49 +189,13 @@ impl<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncWriteT
220
189
Poll :: Ready ( Ok ( Some ( ( ) ) ) )
221
190
}
222
191
}
223
- AsyncWriteState :: WritingLen {
224
- ref current_len,
225
- ref len_to_be_sent,
226
- ref mut len_sent,
227
- } => {
228
- while * len_sent < * len_to_be_sent {
229
- let len = futures_core:: ready!( Pin :: new( & mut * raw)
230
- . poll_write( cx, & current_len[ ( * len_sent) ..( * len_to_be_sent) ] ) ) ?;
231
- * len_sent += len;
232
- }
233
- * state = AsyncWriteState :: WritingValue { bytes_sent : 0 } ;
234
- continue ;
235
- }
236
192
AsyncWriteState :: WritingValue { bytes_sent } => {
237
193
while * bytes_sent < write_buffer. len ( ) {
238
194
let len = futures_core:: ready!(
239
195
Pin :: new( & mut * raw) . poll_write( cx, & write_buffer[ * bytes_sent..] )
240
196
) ?;
241
197
* bytes_sent += len;
242
198
}
243
- if checksum_enabled {
244
- let mut hasher = SipHasher :: new ( ) ;
245
- hasher. write ( write_buffer) ;
246
- let checksum = hasher. finish ( ) ;
247
- * state = AsyncWriteState :: WritingChecksum {
248
- checksum : checksum. to_le_bytes ( ) ,
249
- len_sent : 0 ,
250
- } ;
251
- } else {
252
- * state = AsyncWriteState :: Idle ;
253
- if primed_values. is_empty ( ) {
254
- return Poll :: Ready ( Ok ( Some ( ( ) ) ) ) ;
255
- }
256
- }
257
- continue ;
258
- }
259
- AsyncWriteState :: WritingChecksum { checksum, len_sent } => {
260
- while * len_sent < size_of :: < u64 > ( ) {
261
- let len = futures_core:: ready!(
262
- Pin :: new( & mut * raw) . poll_write( cx, & checksum[ * len_sent..] )
263
- ) ?;
264
- * len_sent += len;
265
- }
266
199
* state = AsyncWriteState :: Idle ;
267
200
if primed_values. is_empty ( ) {
268
201
return Poll :: Ready ( Ok ( Some ( ( ) ) ) ) ;
@@ -330,9 +263,7 @@ impl<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncWriteT
330
263
/// needs to grow.
331
264
pub fn optimize_memory_usage ( & mut self ) {
332
265
match self . state {
333
- AsyncWriteState :: WritingLen { .. } | AsyncWriteState :: WritingValue { .. } => {
334
- self . write_buffer . shrink_to_fit ( )
335
- }
266
+ AsyncWriteState :: WritingValue { .. } => self . write_buffer . shrink_to_fit ( ) ,
336
267
_ => {
337
268
self . write_buffer = Vec :: new ( ) ;
338
269
}
0 commit comments