Ref count stream state and release when final (#73)
Previously, stream state was never released so that long-lived connections leaked memory. Now, stream states are reference-counted and freed from the stream slab when complete. Locally reset streams are retained so that received frames may be ignored.
This commit is contained in:
committed by
Oliver Gould
parent
daa54b9512
commit
5c0efcf8c4
@@ -325,6 +325,7 @@ impl<B, P> Prioritize<B, P>
|
||||
|
||||
pub fn poll_complete<T>(&mut self,
|
||||
store: &mut Store<B, P>,
|
||||
counts: &mut Counts<P>,
|
||||
dst: &mut Codec<T, Prioritized<B>>)
|
||||
-> Poll<(), io::Error>
|
||||
where T: AsyncWrite,
|
||||
@@ -341,7 +342,7 @@ impl<B, P> Prioritize<B, P>
|
||||
trace!("poll_complete");
|
||||
|
||||
loop {
|
||||
match self.pop_frame(store, max_frame_len) {
|
||||
match self.pop_frame(store, max_frame_len, counts) {
|
||||
Some(frame) => {
|
||||
trace!("writing frame={:?}", frame);
|
||||
|
||||
@@ -433,7 +434,7 @@ impl<B, P> Prioritize<B, P>
|
||||
}
|
||||
}
|
||||
|
||||
fn pop_frame(&mut self, store: &mut Store<B, P>, max_len: usize)
|
||||
fn pop_frame(&mut self, store: &mut Store<B, P>, max_len: usize, counts: &mut Counts<P>)
|
||||
-> Option<Frame<Prioritized<B>>>
|
||||
{
|
||||
trace!("pop_frame");
|
||||
@@ -444,6 +445,8 @@ impl<B, P> Prioritize<B, P>
|
||||
trace!("pop_frame; stream={:?}", stream.id);
|
||||
debug_assert!(!stream.pending_send.is_empty());
|
||||
|
||||
let is_counted = stream.state.is_counted();
|
||||
|
||||
let frame = match stream.pending_send.pop_front(&mut self.buffer).unwrap() {
|
||||
Frame::Data(mut frame) => {
|
||||
// Get the amount of capacity remaining for stream's
|
||||
@@ -541,6 +544,8 @@ impl<B, P> Prioritize<B, P>
|
||||
self.pending_send.push(&mut stream);
|
||||
}
|
||||
|
||||
counts.transition_after(stream, is_counted);
|
||||
|
||||
return Some(frame);
|
||||
}
|
||||
None => return None,
|
||||
|
||||
Reference in New Issue
Block a user