|  | @@ -233,7 +233,6 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |    t->is_client = is_client;
 | 
	
		
			
				|  |  |    t->outgoing_window = DEFAULT_WINDOW;
 | 
	
		
			
				|  |  |    t->incoming_window = DEFAULT_WINDOW;
 | 
	
		
			
				|  |  | -  t->connection_window_target = DEFAULT_CONNECTION_WINDOW_TARGET;
 | 
	
		
			
				|  |  |    t->ping_counter = 1;
 | 
	
		
			
				|  |  |    t->pings.next = t->pings.prev = &t->pings;
 | 
	
		
			
				|  |  |    t->deframe_state = is_client ? GRPC_DTS_FH_0 : GRPC_DTS_CLIENT_PREFIX_0;
 | 
	
	
		
			
				|  | @@ -511,6 +510,23 @@ static void destroy_stream_locked(grpc_exec_ctx *exec_ctx, void *sp,
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  if (s->incoming_window_delta > 0) {
 | 
	
		
			
				|  |  | +    t->retract_incoming_window += s->incoming_window_delta;
 | 
	
		
			
				|  |  | +  } else if (s->incoming_window_delta < 0) {
 | 
	
		
			
				|  |  | +    int64_t give_back = -s->incoming_window_delta;
 | 
	
		
			
				|  |  | +    if (give_back > t->retract_incoming_window) {
 | 
	
		
			
				|  |  | +      give_back -= t->retract_incoming_window;
 | 
	
		
			
				|  |  | +      t->retract_incoming_window = 0;
 | 
	
		
			
				|  |  | +      GRPC_CHTTP2_FLOW_CREDIT_TRANSPORT("destroy", t, announce_incoming_window,
 | 
	
		
			
				|  |  | +                                        give_back);
 | 
	
		
			
				|  |  | +      GRPC_CHTTP2_FLOW_CREDIT_TRANSPORT("destroy", t, incoming_window,
 | 
	
		
			
				|  |  | +                                        give_back);
 | 
	
		
			
				|  |  | +      grpc_chttp2_initiate_write(exec_ctx, t, false, "destroy_stream");
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      t->retract_incoming_window -= give_back;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    GPR_ASSERT(s->send_initial_metadata_finished == NULL);
 | 
	
		
			
				|  |  |    GPR_ASSERT(s->fetching_send_message == NULL);
 | 
	
		
			
				|  |  |    GPR_ASSERT(s->send_trailing_metadata_finished == NULL);
 | 
	
	
		
			
				|  | @@ -1786,16 +1802,6 @@ static void read_action_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        t->initial_window_update = 0;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    /* handle higher level things */
 | 
	
		
			
				|  |  | -    if (t->incoming_window < t->connection_window_target * 3 / 4) {
 | 
	
		
			
				|  |  | -      int64_t announce_bytes = t->connection_window_target - t->incoming_window;
 | 
	
		
			
				|  |  | -      GRPC_CHTTP2_FLOW_CREDIT_TRANSPORT("parsed", t, announce_incoming_window,
 | 
	
		
			
				|  |  | -                                        announce_bytes);
 | 
	
		
			
				|  |  | -      GRPC_CHTTP2_FLOW_CREDIT_TRANSPORT("parsed", t, incoming_window,
 | 
	
		
			
				|  |  | -                                        announce_bytes);
 | 
	
		
			
				|  |  | -      grpc_chttp2_initiate_write(exec_ctx, t, false, "global incoming window");
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |      GPR_TIMER_END("post_parse_locked", 0);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1908,6 +1914,19 @@ static void incoming_byte_stream_update_flow_control(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |      grpc_chttp2_become_writable(exec_ctx, t, s,
 | 
	
		
			
				|  |  |                                  new_window_write_is_covered_by_poller,
 | 
	
		
			
				|  |  |                                  "read_incoming_stream");
 | 
	
		
			
				|  |  | +    if (t->retract_incoming_window >= add_max_recv_bytes) {
 | 
	
		
			
				|  |  | +      t->retract_incoming_window -= add_max_recv_bytes;
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      add_max_recv_bytes -= t->retract_incoming_window;
 | 
	
		
			
				|  |  | +      t->retract_incoming_window = 0;
 | 
	
		
			
				|  |  | +      GRPC_CHTTP2_FLOW_CREDIT_TRANSPORT("op", t, announce_incoming_window,
 | 
	
		
			
				|  |  | +                                        add_max_recv_bytes);
 | 
	
		
			
				|  |  | +      GRPC_CHTTP2_FLOW_CREDIT_TRANSPORT("op", t, incoming_window,
 | 
	
		
			
				|  |  | +                                        add_max_recv_bytes);
 | 
	
		
			
				|  |  | +      grpc_chttp2_initiate_write(exec_ctx, t,
 | 
	
		
			
				|  |  | +                                 new_window_write_is_covered_by_poller,
 | 
	
		
			
				|  |  | +                                 "read_incoming_stream");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |