|  | @@ -546,7 +546,8 @@ void grpc_chttp2_initiate_write(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |    switch (t->write_state) {
 | 
	
		
			
				|  |  |      case GRPC_CHTTP2_WRITE_STATE_IDLE:
 | 
	
		
			
				|  |  |        t->write_state = GRPC_CHTTP2_WRITE_STATE_WRITING;
 | 
	
		
			
				|  |  | -      gpr_log(GPR_DEBUG, "W:%s:%p: IDLE -> WRITING", t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  | +      gpr_log(GPR_DEBUG, "W:%s:%p: IDLE -> WRITING",
 | 
	
		
			
				|  |  | +              t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  |        GRPC_CHTTP2_REF_TRANSPORT(t, "writing");
 | 
	
		
			
				|  |  |        grpc_combiner_execute_finally(exec_ctx, t->combiner,
 | 
	
		
			
				|  |  |                                      &t->write_action_begin_locked,
 | 
	
	
		
			
				|  | @@ -554,7 +555,8 @@ void grpc_chttp2_initiate_write(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      case GRPC_CHTTP2_WRITE_STATE_WRITING:
 | 
	
		
			
				|  |  |        t->write_state = GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE_TO_COME;
 | 
	
		
			
				|  |  | -      gpr_log(GPR_DEBUG, "W:%s:%p: WRITING -> WRITING_MORE", t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  | +      gpr_log(GPR_DEBUG, "W:%s:%p: WRITING -> WRITING_MORE",
 | 
	
		
			
				|  |  | +              t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      case GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE_TO_COME:
 | 
	
		
			
				|  |  |        break;
 | 
	
	
		
			
				|  | @@ -579,10 +581,12 @@ static void write_action_begin_locked(grpc_exec_ctx *exec_ctx, void *gt,
 | 
	
		
			
				|  |  |    GPR_ASSERT(t->write_state != GRPC_CHTTP2_WRITE_STATE_IDLE);
 | 
	
		
			
				|  |  |    if (!t->closed && grpc_chttp2_begin_write(exec_ctx, t)) {
 | 
	
		
			
				|  |  |      t->write_state = GRPC_CHTTP2_WRITE_STATE_WRITING;
 | 
	
		
			
				|  |  | -      gpr_log(GPR_DEBUG, "W:%s:%p: WRITING|WRITING_MORE -> WRITING", t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  | +    gpr_log(GPR_DEBUG, "W:%s:%p: WRITING|WRITING_MORE -> WRITING",
 | 
	
		
			
				|  |  | +            t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  |      grpc_exec_ctx_sched(exec_ctx, &t->write_action, GRPC_ERROR_NONE, NULL);
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  | -      gpr_log(GPR_DEBUG, "W:%s:%p: WRITING|WRITING_MORE -> IDLE", t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  | +    gpr_log(GPR_DEBUG, "W:%s:%p: WRITING|WRITING_MORE -> IDLE",
 | 
	
		
			
				|  |  | +            t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  |      t->write_state = GRPC_CHTTP2_WRITE_STATE_IDLE;
 | 
	
		
			
				|  |  |      GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "writing");
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -622,14 +626,17 @@ static void write_action_end_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
		
			
				|  |  |      case GRPC_CHTTP2_WRITE_STATE_WRITING:
 | 
	
		
			
				|  |  |        GPR_TIMER_MARK("state=writing", 0);
 | 
	
		
			
				|  |  |        t->write_state = GRPC_CHTTP2_WRITE_STATE_IDLE;
 | 
	
		
			
				|  |  | -      gpr_log(GPR_DEBUG, "W:%s:%p: WRITING -> IDLE", t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  | +      gpr_log(GPR_DEBUG, "W:%s:%p: WRITING -> IDLE",
 | 
	
		
			
				|  |  | +              t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      case GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE_TO_COME:
 | 
	
		
			
				|  |  |        GPR_TIMER_MARK("state=writing_stale_with_poller", 0);
 | 
	
		
			
				|  |  |        t->write_state = GRPC_CHTTP2_WRITE_STATE_WRITING;
 | 
	
		
			
				|  |  | -      gpr_log(GPR_DEBUG, "W:%s:%p: WRITING_MORE -> WRITING", t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  | +      gpr_log(GPR_DEBUG, "W:%s:%p: WRITING_MORE -> WRITING",
 | 
	
		
			
				|  |  | +              t->is_client ? "CLIENT" : "SERVER", t);
 | 
	
		
			
				|  |  |        GRPC_CHTTP2_REF_TRANSPORT(t, "writing");
 | 
	
		
			
				|  |  | -      grpc_combiner_execute_finally(exec_ctx, t->combiner, &t->write_action_begin_locked,
 | 
	
		
			
				|  |  | +      grpc_combiner_execute_finally(exec_ctx, t->combiner,
 | 
	
		
			
				|  |  | +                                    &t->write_action_begin_locked,
 | 
	
		
			
				|  |  |                                      GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -1429,7 +1436,17 @@ static void fail_pending_writes(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |                                      &s->send_trailing_metadata_finished,
 | 
	
		
			
				|  |  |                                      GRPC_ERROR_REF(error));
 | 
	
		
			
				|  |  |    grpc_chttp2_complete_closure_step(exec_ctx, t, s,
 | 
	
		
			
				|  |  | -                                    &s->fetching_send_message_finished, error);
 | 
	
		
			
				|  |  | +                                    &s->fetching_send_message_finished,
 | 
	
		
			
				|  |  | +                                    GRPC_ERROR_REF(error));
 | 
	
		
			
				|  |  | +  while (s->on_write_finished_cbs) {
 | 
	
		
			
				|  |  | +    grpc_chttp2_write_cb *cb = s->on_write_finished_cbs;
 | 
	
		
			
				|  |  | +    s->on_write_finished_cbs = cb->next;
 | 
	
		
			
				|  |  | +    grpc_chttp2_complete_closure_step(exec_ctx, t, s, &cb->closure,
 | 
	
		
			
				|  |  | +                                      GRPC_ERROR_REF(error));
 | 
	
		
			
				|  |  | +    cb->next = t->write_cb_pool;
 | 
	
		
			
				|  |  | +    t->write_cb_pool = cb;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  GRPC_ERROR_UNREF(error);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void grpc_chttp2_mark_stream_closed(grpc_exec_ctx *exec_ctx,
 | 
	
	
		
			
				|  | @@ -1624,14 +1641,19 @@ static void update_global_window(void *args, uint32_t id, void *stream) {
 | 
	
		
			
				|  |  |    int is_zero;
 | 
	
		
			
				|  |  |    int64_t initial_window_update = t->initial_window_update;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  was_zero = s->outgoing_window <= 0;
 | 
	
		
			
				|  |  | -  GRPC_CHTTP2_FLOW_CREDIT_STREAM("settings", t, s, outgoing_window,
 | 
	
		
			
				|  |  | -                                 initial_window_update);
 | 
	
		
			
				|  |  | -  is_zero = s->outgoing_window <= 0;
 | 
	
		
			
				|  |  | +  if (initial_window_update > 0) {
 | 
	
		
			
				|  |  | +    was_zero = s->outgoing_window <= 0;
 | 
	
		
			
				|  |  | +    GRPC_CHTTP2_FLOW_CREDIT_STREAM("settings", t, s, outgoing_window,
 | 
	
		
			
				|  |  | +                                   initial_window_update);
 | 
	
		
			
				|  |  | +    is_zero = s->outgoing_window <= 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if (was_zero && !is_zero) {
 | 
	
		
			
				|  |  | -    grpc_chttp2_become_writable(a->exec_ctx, t, s, true,
 | 
	
		
			
				|  |  | -                                "update_global_window");
 | 
	
		
			
				|  |  | +    if (was_zero && !is_zero) {
 | 
	
		
			
				|  |  | +      grpc_chttp2_become_writable(a->exec_ctx, t, s, true,
 | 
	
		
			
				|  |  | +                                  "update_global_window");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    GRPC_CHTTP2_FLOW_DEBIT_STREAM("settings", t, s, outgoing_window,
 | 
	
		
			
				|  |  | +                                  -initial_window_update);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |