Skip to content

Commit 6b522bd

Browse files
committed
reduce total count of write states
1 parent 14a1e7c commit 6b522bd

File tree

2 files changed

+32
-103
lines changed

2 files changed

+32
-103
lines changed

src/duplex.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,7 @@ impl<RW: AsyncRead + AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin
9090
}
9191
}
9292
match self.write_state {
93-
AsyncWriteState::WritingLen { .. } | AsyncWriteState::WritingValue { .. } => {
94-
self.write_buffer.shrink_to_fit()
95-
}
93+
AsyncWriteState::WritingValue { .. } => self.write_buffer.shrink_to_fit(),
9694
_ => {
9795
self.write_buffer = Vec::new();
9896
}

src/write.rs

Lines changed: 31 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -26,24 +26,10 @@ pub struct AsyncWriteTyped<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwne
2626

2727
#[derive(Debug)]
2828
pub(crate) enum AsyncWriteState {
29-
WritingVersion {
30-
version: [u8; 8],
31-
len_sent: usize,
32-
},
29+
WritingVersion { version: [u8; 8], len_sent: usize },
3330
WritingChecksumEnabled,
3431
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 },
4733
Closing,
4834
Closed,
4935
}
@@ -163,55 +149,38 @@ impl<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncWriteT
163149
AsyncWriteState::Idle => {
164150
if let Some(item) = primed_values.pop_back() {
165151
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)
168154
.map_err(Error::Bincode)?;
169-
if write_buffer.len() as u64 > size_limit {
155+
if length > size_limit {
170156
return Poll::Ready(Err(Error::SentMessageTooLarge));
171157
}
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());
188168
} 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 };
215184
continue;
216185
} else if closing {
217186
*state = AsyncWriteState::Closing;
@@ -220,49 +189,13 @@ impl<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncWriteT
220189
Poll::Ready(Ok(Some(())))
221190
}
222191
}
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-
}
236192
AsyncWriteState::WritingValue { bytes_sent } => {
237193
while *bytes_sent < write_buffer.len() {
238194
let len = futures_core::ready!(
239195
Pin::new(&mut *raw).poll_write(cx, &write_buffer[*bytes_sent..])
240196
)?;
241197
*bytes_sent += len;
242198
}
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-
}
266199
*state = AsyncWriteState::Idle;
267200
if primed_values.is_empty() {
268201
return Poll::Ready(Ok(Some(())));
@@ -330,9 +263,7 @@ impl<W: AsyncWrite + Unpin, T: Serialize + DeserializeOwned + Unpin> AsyncWriteT
330263
/// needs to grow.
331264
pub fn optimize_memory_usage(&mut self) {
332265
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(),
336267
_ => {
337268
self.write_buffer = Vec::new();
338269
}

0 commit comments

Comments
 (0)