Refactor functions to update consumed size

This commit is contained in:
Tatsuhiro Tsujikawa 2014-08-23 18:56:04 +09:00
parent 9ad2c0887e
commit 02c5621c61
1 changed files with 25 additions and 39 deletions

View File

@ -3999,72 +3999,58 @@ static int session_update_recv_connection_window_size
return 0; return 0;
} }
static int session_update_stream_consumed_size static int session_update_consumed_size
(nghttp2_session *session, nghttp2_stream *stream, size_t delta_size) (nghttp2_session *session,
int32_t *consumed_size_ptr,
int32_t *recv_window_size_ptr,
int32_t stream_id,
size_t delta_size,
int32_t local_window_size)
{ {
int32_t recv_size; int32_t recv_size;
int rv; int rv;
if((size_t)stream->consumed_size > NGHTTP2_MAX_WINDOW_SIZE - delta_size) { if((size_t)*consumed_size_ptr > NGHTTP2_MAX_WINDOW_SIZE - delta_size) {
return nghttp2_session_terminate_session(session, return nghttp2_session_terminate_session(session,
NGHTTP2_FLOW_CONTROL_ERROR); NGHTTP2_FLOW_CONTROL_ERROR);
} }
stream->consumed_size += delta_size; *consumed_size_ptr += delta_size;
/* recv_window_size may be smaller than consumed_size, because it /* recv_window_size may be smaller than consumed_size, because it
may be decreased by negative value with may be decreased by negative value with
nghttp2_submit_window_update(). */ nghttp2_submit_window_update(). */
recv_size = nghttp2_min(stream->consumed_size, stream->recv_window_size); recv_size = nghttp2_min(*consumed_size_ptr, *recv_window_size_ptr);
if(nghttp2_should_send_window_update(stream->local_window_size, recv_size)) { if(nghttp2_should_send_window_update(local_window_size, recv_size)) {
rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE, rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE,
stream->stream_id, recv_size); stream_id, recv_size);
if(rv != 0) { if(rv != 0) {
return rv; return rv;
} }
stream->recv_window_size -= recv_size; *recv_window_size_ptr -= recv_size;
stream->consumed_size -= recv_size; *consumed_size_ptr -= recv_size;
} }
return 0; return 0;
} }
static int session_update_stream_consumed_size
(nghttp2_session *session, nghttp2_stream *stream, size_t delta_size)
{
return session_update_consumed_size
(session, &stream->consumed_size, &stream->recv_window_size,
stream->stream_id, delta_size, stream->local_window_size);
}
static int session_update_connection_consumed_size static int session_update_connection_consumed_size
(nghttp2_session *session, size_t delta_size) (nghttp2_session *session, size_t delta_size)
{ {
int32_t recv_size; return session_update_consumed_size
int rv; (session, &session->consumed_size, &session->recv_window_size,
0, delta_size, session->local_window_size);
if((size_t)session->consumed_size > NGHTTP2_MAX_WINDOW_SIZE - delta_size) {
return nghttp2_session_terminate_session(session,
NGHTTP2_FLOW_CONTROL_ERROR);
}
session->consumed_size += delta_size;
/* recv_window_size may be smaller than consumed_size, because it
may be decreased by negative value with
nghttp2_submit_window_update(). */
recv_size = nghttp2_min(session->consumed_size, session->recv_window_size);
if(nghttp2_should_send_window_update(session->local_window_size,
recv_size)) {
rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE, 0,
recv_size);
if(rv != 0) {
return rv;
}
session->recv_window_size -= recv_size;
session->consumed_size -= recv_size;
}
return 0;
} }
/* /*