summaryrefslogtreecommitdiffstats
path: root/vendor/h2/src/proto/streams/flow_control.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/h2/src/proto/streams/flow_control.rs')
-rw-r--r--vendor/h2/src/proto/streams/flow_control.rs73
1 files changed, 40 insertions, 33 deletions
diff --git a/vendor/h2/src/proto/streams/flow_control.rs b/vendor/h2/src/proto/streams/flow_control.rs
index 73a7754db..57a935825 100644
--- a/vendor/h2/src/proto/streams/flow_control.rs
+++ b/vendor/h2/src/proto/streams/flow_control.rs
@@ -75,12 +75,12 @@ impl FlowControl {
self.window_size > self.available
}
- pub fn claim_capacity(&mut self, capacity: WindowSize) {
- self.available -= capacity;
+ pub fn claim_capacity(&mut self, capacity: WindowSize) -> Result<(), Reason> {
+ self.available.decrease_by(capacity)
}
- pub fn assign_capacity(&mut self, capacity: WindowSize) {
- self.available += capacity;
+ pub fn assign_capacity(&mut self, capacity: WindowSize) -> Result<(), Reason> {
+ self.available.increase_by(capacity)
}
/// If a WINDOW_UPDATE frame should be sent, returns a positive number
@@ -136,22 +136,23 @@ impl FlowControl {
///
/// This is called after receiving a SETTINGS frame with a lower
/// INITIAL_WINDOW_SIZE value.
- pub fn dec_send_window(&mut self, sz: WindowSize) {
+ pub fn dec_send_window(&mut self, sz: WindowSize) -> Result<(), Reason> {
tracing::trace!(
"dec_window; sz={}; window={}, available={}",
sz,
self.window_size,
self.available
);
- // This should not be able to overflow `window_size` from the bottom.
- self.window_size -= sz;
+ // ~~This should not be able to overflow `window_size` from the bottom.~~ wrong. it can.
+ self.window_size.decrease_by(sz)?;
+ Ok(())
}
/// Decrement the recv-side window size.
///
/// This is called after receiving a SETTINGS ACK frame with a lower
/// INITIAL_WINDOW_SIZE value.
- pub fn dec_recv_window(&mut self, sz: WindowSize) {
+ pub fn dec_recv_window(&mut self, sz: WindowSize) -> Result<(), Reason> {
tracing::trace!(
"dec_recv_window; sz={}; window={}, available={}",
sz,
@@ -159,13 +160,14 @@ impl FlowControl {
self.available
);
// This should not be able to overflow `window_size` from the bottom.
- self.window_size -= sz;
- self.available -= sz;
+ self.window_size.decrease_by(sz)?;
+ self.available.decrease_by(sz)?;
+ Ok(())
}
/// Decrements the window reflecting data has actually been sent. The caller
/// must ensure that the window has capacity.
- pub fn send_data(&mut self, sz: WindowSize) {
+ pub fn send_data(&mut self, sz: WindowSize) -> Result<(), Reason> {
tracing::trace!(
"send_data; sz={}; window={}; available={}",
sz,
@@ -176,12 +178,13 @@ impl FlowControl {
// If send size is zero it's meaningless to update flow control window
if sz > 0 {
// Ensure that the argument is correct
- assert!(self.window_size >= sz as usize);
+ assert!(self.window_size.0 >= sz as i32);
// Update values
- self.window_size -= sz;
- self.available -= sz;
+ self.window_size.decrease_by(sz)?;
+ self.available.decrease_by(sz)?;
}
+ Ok(())
}
}
@@ -208,6 +211,29 @@ impl Window {
assert!(self.0 >= 0, "negative Window");
self.0 as WindowSize
}
+
+ pub fn decrease_by(&mut self, other: WindowSize) -> Result<(), Reason> {
+ if let Some(v) = self.0.checked_sub(other as i32) {
+ self.0 = v;
+ Ok(())
+ } else {
+ Err(Reason::FLOW_CONTROL_ERROR)
+ }
+ }
+
+ pub fn increase_by(&mut self, other: WindowSize) -> Result<(), Reason> {
+ let other = self.add(other)?;
+ self.0 = other.0;
+ Ok(())
+ }
+
+ pub fn add(&self, other: WindowSize) -> Result<Self, Reason> {
+ if let Some(v) = self.0.checked_add(other as i32) {
+ Ok(Self(v))
+ } else {
+ Err(Reason::FLOW_CONTROL_ERROR)
+ }
+ }
}
impl PartialEq<usize> for Window {
@@ -230,25 +256,6 @@ impl PartialOrd<usize> for Window {
}
}
-impl ::std::ops::SubAssign<WindowSize> for Window {
- fn sub_assign(&mut self, other: WindowSize) {
- self.0 -= other as i32;
- }
-}
-
-impl ::std::ops::Add<WindowSize> for Window {
- type Output = Self;
- fn add(self, other: WindowSize) -> Self::Output {
- Window(self.0 + other as i32)
- }
-}
-
-impl ::std::ops::AddAssign<WindowSize> for Window {
- fn add_assign(&mut self, other: WindowSize) {
- self.0 += other as i32;
- }
-}
-
impl fmt::Display for Window {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(&self.0, f)