|  | #ifndef QUICHE_HTTP2_ADAPTER_WINDOW_MANAGER_H_ | 
|  | #define QUICHE_HTTP2_ADAPTER_WINDOW_MANAGER_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  |  | 
|  | #include <functional> | 
|  |  | 
|  | #include "common/platform/api/quiche_export.h" | 
|  |  | 
|  | namespace http2 { | 
|  | namespace adapter { | 
|  |  | 
|  | namespace test { | 
|  | class WindowManagerPeer; | 
|  | } | 
|  |  | 
|  | // This class keeps track of a HTTP/2 flow control window, notifying a listener | 
|  | // when a window update needs to be sent. This class is not thread-safe. | 
|  | class QUICHE_EXPORT_PRIVATE WindowManager { | 
|  | public: | 
|  | // A WindowUpdateListener is invoked when it is time to send a window update. | 
|  | typedef std::function<void(size_t)> WindowUpdateListener; | 
|  |  | 
|  | WindowManager(size_t window_size_limit, | 
|  | WindowUpdateListener listener); | 
|  |  | 
|  | size_t CurrentWindowSize() const { return window_; } | 
|  | size_t WindowSizeLimit() const { return limit_; } | 
|  |  | 
|  | // Called when the window size limit is changed (typically via settings) but | 
|  | // no window update should be sent. | 
|  | void OnWindowSizeLimitChange(size_t new_limit); | 
|  |  | 
|  | // Sets the window size limit to |new_limit| and notifies the listener to | 
|  | // update as necessary. | 
|  | void SetWindowSizeLimit(size_t new_limit); | 
|  |  | 
|  | // Increments the running total of data bytes buffered. Returns true iff there | 
|  | // is more window remaining. | 
|  | bool MarkDataBuffered(size_t bytes); | 
|  |  | 
|  | // Increments the running total of data bytes that have been flushed or | 
|  | // dropped. Invokes the listener if the current window is smaller than some | 
|  | // threshold and there is quota available to send. | 
|  | void MarkDataFlushed(size_t bytes); | 
|  |  | 
|  | // Convenience method, used when incoming data is immediately dropped or | 
|  | // ignored. | 
|  | void MarkWindowConsumed(size_t bytes) { | 
|  | MarkDataBuffered(bytes); | 
|  | MarkDataFlushed(bytes); | 
|  | } | 
|  |  | 
|  | private: | 
|  | friend class test::WindowManagerPeer; | 
|  |  | 
|  | void MaybeNotifyListener(); | 
|  |  | 
|  | // The upper bound on the flow control window. The GFE attempts to maintain a | 
|  | // window of this size at the peer as data is proxied through. | 
|  | size_t limit_; | 
|  |  | 
|  | // The current flow control window that has not been advertised to the peer | 
|  | // and not yet consumed. The peer can send this many bytes before becoming | 
|  | // blocked. | 
|  | size_t window_; | 
|  |  | 
|  | // The amount of data already buffered, which should count against the flow | 
|  | // control window upper bound. | 
|  | size_t buffered_; | 
|  |  | 
|  | WindowUpdateListener listener_; | 
|  | }; | 
|  |  | 
|  | }  // namespace adapter | 
|  | }  // namespace http2 | 
|  |  | 
|  | #endif  // QUICHE_HTTP2_ADAPTER_WINDOW_MANAGER_H_ |