|  | @@ -159,11 +159,9 @@ static void finish_bdp_ping_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void cancel_pings(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                           grpc_error *error);
 | 
	
		
			
				|  |  | -static void send_ping_locked(
 | 
	
		
			
				|  |  | -    grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  | -    grpc_chttp2_ping_type ping_type, grpc_closure *on_initiate,
 | 
	
		
			
				|  |  | -    grpc_closure *on_complete,
 | 
	
		
			
				|  |  | -    grpc_chttp2_initiate_write_reason initiate_write_reason);
 | 
	
		
			
				|  |  | +static void send_ping_locked(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  | +                             grpc_closure *on_initiate,
 | 
	
		
			
				|  |  | +                             grpc_closure *on_complete);
 | 
	
		
			
				|  |  |  static void retry_initiate_ping_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
		
			
				|  |  |                                         grpc_error *error);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -279,6 +277,7 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |    t->is_client = is_client;
 | 
	
		
			
				|  |  |    t->flow_control.remote_window = DEFAULT_WINDOW;
 | 
	
		
			
				|  |  |    t->flow_control.announced_window = DEFAULT_WINDOW;
 | 
	
		
			
				|  |  | +  t->flow_control.target_initial_window_size = DEFAULT_WINDOW;
 | 
	
		
			
				|  |  |    t->flow_control.t = t;
 | 
	
		
			
				|  |  |    t->deframe_state = is_client ? GRPC_DTS_FH_0 : GRPC_DTS_CLIENT_PREFIX_0;
 | 
	
		
			
				|  |  |    t->is_first_frame = true;
 | 
	
	
		
			
				|  | @@ -317,17 +316,6 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                      grpc_combiner_scheduler(t->combiner));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    grpc_bdp_estimator_init(&t->flow_control.bdp_estimator, t->peer_string);
 | 
	
		
			
				|  |  | -  t->flow_control.last_pid_update = gpr_now(GPR_CLOCK_MONOTONIC);
 | 
	
		
			
				|  |  | -  grpc_pid_controller_init(&t->flow_control.pid_controller,
 | 
	
		
			
				|  |  | -                           {
 | 
	
		
			
				|  |  | -                               4,                    /* gain_p */
 | 
	
		
			
				|  |  | -                               8,                    /* gain_t */
 | 
	
		
			
				|  |  | -                               0,                    /* gain_d */
 | 
	
		
			
				|  |  | -                               log2(DEFAULT_WINDOW), /* initial_control_value */
 | 
	
		
			
				|  |  | -                               -1,                   /* min_control_value */
 | 
	
		
			
				|  |  | -                               25,                   /* max_control_value */
 | 
	
		
			
				|  |  | -                               10                    /* integral_range */
 | 
	
		
			
				|  |  | -                           });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    grpc_chttp2_goaway_parser_init(&t->goaway_parser);
 | 
	
		
			
				|  |  |    grpc_chttp2_hpack_parser_init(exec_ctx, &t->hpack_parser);
 | 
	
	
		
			
				|  | @@ -366,43 +354,33 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |      queue_setting_update(exec_ctx, t,
 | 
	
		
			
				|  |  |                           GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 0);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  queue_setting_update(exec_ctx, t, GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
 | 
	
		
			
				|  |  | -                       DEFAULT_WINDOW);
 | 
	
		
			
				|  |  |    queue_setting_update(exec_ctx, t, GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE,
 | 
	
		
			
				|  |  |                         DEFAULT_MAX_HEADER_LIST_SIZE);
 | 
	
		
			
				|  |  |    queue_setting_update(exec_ctx, t,
 | 
	
		
			
				|  |  |                         GRPC_CHTTP2_SETTINGS_GRPC_ALLOW_TRUE_BINARY_METADATA, 1);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    t->ping_policy.max_pings_without_data = g_default_max_pings_without_data;
 | 
	
		
			
				|  |  | -  t->ping_policy.min_sent_ping_interval_without_data = gpr_time_from_millis(
 | 
	
		
			
				|  |  | -      g_default_min_sent_ping_interval_without_data_ms, GPR_TIMESPAN);
 | 
	
		
			
				|  |  | +  t->ping_policy.min_sent_ping_interval_without_data =
 | 
	
		
			
				|  |  | +      g_default_min_sent_ping_interval_without_data_ms;
 | 
	
		
			
				|  |  |    t->ping_policy.max_ping_strikes = g_default_max_ping_strikes;
 | 
	
		
			
				|  |  | -  t->ping_policy.min_recv_ping_interval_without_data = gpr_time_from_millis(
 | 
	
		
			
				|  |  | -      g_default_min_recv_ping_interval_without_data_ms, GPR_TIMESPAN);
 | 
	
		
			
				|  |  | +  t->ping_policy.min_recv_ping_interval_without_data =
 | 
	
		
			
				|  |  | +      g_default_min_recv_ping_interval_without_data_ms;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Keepalive setting */
 | 
	
		
			
				|  |  |    if (t->is_client) {
 | 
	
		
			
				|  |  | -    t->keepalive_time =
 | 
	
		
			
				|  |  | -        g_default_client_keepalive_time_ms == INT_MAX
 | 
	
		
			
				|  |  | -            ? gpr_inf_future(GPR_TIMESPAN)
 | 
	
		
			
				|  |  | -            : gpr_time_from_millis(g_default_client_keepalive_time_ms,
 | 
	
		
			
				|  |  | -                                   GPR_TIMESPAN);
 | 
	
		
			
				|  |  | -    t->keepalive_timeout =
 | 
	
		
			
				|  |  | -        g_default_client_keepalive_timeout_ms == INT_MAX
 | 
	
		
			
				|  |  | -            ? gpr_inf_future(GPR_TIMESPAN)
 | 
	
		
			
				|  |  | -            : gpr_time_from_millis(g_default_client_keepalive_timeout_ms,
 | 
	
		
			
				|  |  | -                                   GPR_TIMESPAN);
 | 
	
		
			
				|  |  | +    t->keepalive_time = g_default_client_keepalive_time_ms == INT_MAX
 | 
	
		
			
				|  |  | +                            ? GRPC_MILLIS_INF_FUTURE
 | 
	
		
			
				|  |  | +                            : g_default_client_keepalive_time_ms;
 | 
	
		
			
				|  |  | +    t->keepalive_timeout = g_default_client_keepalive_timeout_ms == INT_MAX
 | 
	
		
			
				|  |  | +                               ? GRPC_MILLIS_INF_FUTURE
 | 
	
		
			
				|  |  | +                               : g_default_client_keepalive_timeout_ms;
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  | -    t->keepalive_time =
 | 
	
		
			
				|  |  | -        g_default_server_keepalive_time_ms == INT_MAX
 | 
	
		
			
				|  |  | -            ? gpr_inf_future(GPR_TIMESPAN)
 | 
	
		
			
				|  |  | -            : gpr_time_from_millis(g_default_server_keepalive_time_ms,
 | 
	
		
			
				|  |  | -                                   GPR_TIMESPAN);
 | 
	
		
			
				|  |  | -    t->keepalive_timeout =
 | 
	
		
			
				|  |  | -        g_default_server_keepalive_timeout_ms == INT_MAX
 | 
	
		
			
				|  |  | -            ? gpr_inf_future(GPR_TIMESPAN)
 | 
	
		
			
				|  |  | -            : gpr_time_from_millis(g_default_server_keepalive_timeout_ms,
 | 
	
		
			
				|  |  | -                                   GPR_TIMESPAN);
 | 
	
		
			
				|  |  | +    t->keepalive_time = g_default_server_keepalive_time_ms == INT_MAX
 | 
	
		
			
				|  |  | +                            ? GRPC_MILLIS_INF_FUTURE
 | 
	
		
			
				|  |  | +                            : g_default_server_keepalive_time_ms;
 | 
	
		
			
				|  |  | +    t->keepalive_timeout = g_default_server_keepalive_timeout_ms == INT_MAX
 | 
	
		
			
				|  |  | +                               ? GRPC_MILLIS_INF_FUTURE
 | 
	
		
			
				|  |  | +                               : g_default_server_keepalive_timeout_ms;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    t->keepalive_permit_without_calls = g_default_keepalive_permit_without_calls;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -447,23 +425,21 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                       channel_args->args[i].key,
 | 
	
		
			
				|  |  |                       GRPC_ARG_HTTP2_MIN_SENT_PING_INTERVAL_WITHOUT_DATA_MS)) {
 | 
	
		
			
				|  |  |          t->ping_policy.min_sent_ping_interval_without_data =
 | 
	
		
			
				|  |  | -            gpr_time_from_millis(
 | 
	
		
			
				|  |  | -                grpc_channel_arg_get_integer(
 | 
	
		
			
				|  |  | -                    &channel_args->args[i],
 | 
	
		
			
				|  |  | -                    {g_default_min_sent_ping_interval_without_data_ms, 0,
 | 
	
		
			
				|  |  | -                     INT_MAX}),
 | 
	
		
			
				|  |  | -                GPR_TIMESPAN);
 | 
	
		
			
				|  |  | +            grpc_channel_arg_get_integer(
 | 
	
		
			
				|  |  | +                &channel_args->args[i],
 | 
	
		
			
				|  |  | +                grpc_integer_options{
 | 
	
		
			
				|  |  | +                    g_default_min_sent_ping_interval_without_data_ms, 0,
 | 
	
		
			
				|  |  | +                    INT_MAX});
 | 
	
		
			
				|  |  |        } else if (0 ==
 | 
	
		
			
				|  |  |                   strcmp(
 | 
	
		
			
				|  |  |                       channel_args->args[i].key,
 | 
	
		
			
				|  |  |                       GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS)) {
 | 
	
		
			
				|  |  |          t->ping_policy.min_recv_ping_interval_without_data =
 | 
	
		
			
				|  |  | -            gpr_time_from_millis(
 | 
	
		
			
				|  |  | -                grpc_channel_arg_get_integer(
 | 
	
		
			
				|  |  | -                    &channel_args->args[i],
 | 
	
		
			
				|  |  | -                    {g_default_min_recv_ping_interval_without_data_ms, 0,
 | 
	
		
			
				|  |  | -                     INT_MAX}),
 | 
	
		
			
				|  |  | -                GPR_TIMESPAN);
 | 
	
		
			
				|  |  | +            grpc_channel_arg_get_integer(
 | 
	
		
			
				|  |  | +                &channel_args->args[i],
 | 
	
		
			
				|  |  | +                grpc_integer_options{
 | 
	
		
			
				|  |  | +                    g_default_min_recv_ping_interval_without_data_ms, 0,
 | 
	
		
			
				|  |  | +                    INT_MAX});
 | 
	
		
			
				|  |  |        } else if (0 == strcmp(channel_args->args[i].key,
 | 
	
		
			
				|  |  |                               GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE)) {
 | 
	
		
			
				|  |  |          t->write_buffer_size = (uint32_t)grpc_channel_arg_get_integer(
 | 
	
	
		
			
				|  | @@ -476,22 +452,21 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                               GRPC_ARG_KEEPALIVE_TIME_MS)) {
 | 
	
		
			
				|  |  |          const int value = grpc_channel_arg_get_integer(
 | 
	
		
			
				|  |  |              &channel_args->args[i],
 | 
	
		
			
				|  |  | -            {t->is_client ? g_default_client_keepalive_time_ms
 | 
	
		
			
				|  |  | -                          : g_default_server_keepalive_time_ms,
 | 
	
		
			
				|  |  | -             1, INT_MAX});
 | 
	
		
			
				|  |  | -        t->keepalive_time = value == INT_MAX
 | 
	
		
			
				|  |  | -                                ? gpr_inf_future(GPR_TIMESPAN)
 | 
	
		
			
				|  |  | -                                : gpr_time_from_millis(value, GPR_TIMESPAN);
 | 
	
		
			
				|  |  | +            grpc_integer_options{t->is_client
 | 
	
		
			
				|  |  | +                                     ? g_default_client_keepalive_time_ms
 | 
	
		
			
				|  |  | +                                     : g_default_server_keepalive_time_ms,
 | 
	
		
			
				|  |  | +                                 1, INT_MAX});
 | 
	
		
			
				|  |  | +        t->keepalive_time = value == INT_MAX ? GRPC_MILLIS_INF_FUTURE : value;
 | 
	
		
			
				|  |  |        } else if (0 == strcmp(channel_args->args[i].key,
 | 
	
		
			
				|  |  |                               GRPC_ARG_KEEPALIVE_TIMEOUT_MS)) {
 | 
	
		
			
				|  |  |          const int value = grpc_channel_arg_get_integer(
 | 
	
		
			
				|  |  |              &channel_args->args[i],
 | 
	
		
			
				|  |  | -            {t->is_client ? g_default_client_keepalive_timeout_ms
 | 
	
		
			
				|  |  | -                          : g_default_server_keepalive_timeout_ms,
 | 
	
		
			
				|  |  | -             0, INT_MAX});
 | 
	
		
			
				|  |  | -        t->keepalive_timeout = value == INT_MAX
 | 
	
		
			
				|  |  | -                                   ? gpr_inf_future(GPR_TIMESPAN)
 | 
	
		
			
				|  |  | -                                   : gpr_time_from_millis(value, GPR_TIMESPAN);
 | 
	
		
			
				|  |  | +            grpc_integer_options{t->is_client
 | 
	
		
			
				|  |  | +                                     ? g_default_client_keepalive_timeout_ms
 | 
	
		
			
				|  |  | +                                     : g_default_server_keepalive_timeout_ms,
 | 
	
		
			
				|  |  | +                                 0, INT_MAX});
 | 
	
		
			
				|  |  | +        t->keepalive_timeout =
 | 
	
		
			
				|  |  | +            value == INT_MAX ? GRPC_MILLIS_INF_FUTURE : value;
 | 
	
		
			
				|  |  |        } else if (0 == strcmp(channel_args->args[i].key,
 | 
	
		
			
				|  |  |                               GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS)) {
 | 
	
		
			
				|  |  |          t->keepalive_permit_without_calls =
 | 
	
	
		
			
				|  | @@ -571,23 +546,27 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |    t->ping_state.pings_before_data_required = 0;
 | 
	
		
			
				|  |  |    t->ping_state.is_delayed_ping_timer_set = false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  t->ping_recv_state.last_ping_recv_time = gpr_inf_past(GPR_CLOCK_MONOTONIC);
 | 
	
		
			
				|  |  | +  t->ping_recv_state.last_ping_recv_time = GRPC_MILLIS_INF_PAST;
 | 
	
		
			
				|  |  |    t->ping_recv_state.ping_strikes = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* Start keepalive pings */
 | 
	
		
			
				|  |  | -  if (gpr_time_cmp(t->keepalive_time, gpr_inf_future(GPR_TIMESPAN)) != 0) {
 | 
	
		
			
				|  |  | +  if (t->keepalive_time != GRPC_MILLIS_INF_FUTURE) {
 | 
	
		
			
				|  |  |      t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_WAITING;
 | 
	
		
			
				|  |  |      GRPC_CHTTP2_REF_TRANSPORT(t, "init keepalive ping");
 | 
	
		
			
				|  |  | -    grpc_timer_init(
 | 
	
		
			
				|  |  | -        exec_ctx, &t->keepalive_ping_timer,
 | 
	
		
			
				|  |  | -        gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), t->keepalive_time),
 | 
	
		
			
				|  |  | -        &t->init_keepalive_ping_locked, gpr_now(GPR_CLOCK_MONOTONIC));
 | 
	
		
			
				|  |  | +    grpc_timer_init(exec_ctx, &t->keepalive_ping_timer,
 | 
	
		
			
				|  |  | +                    grpc_exec_ctx_now(exec_ctx) + t->keepalive_time,
 | 
	
		
			
				|  |  | +                    &t->init_keepalive_ping_locked);
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      /* Use GRPC_CHTTP2_KEEPALIVE_STATE_DISABLED to indicate there are no
 | 
	
		
			
				|  |  |         inflight keeaplive timers */
 | 
	
		
			
				|  |  |      t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_DISABLED;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  grpc_chttp2_act_on_flowctl_action(
 | 
	
		
			
				|  |  | +      exec_ctx,
 | 
	
		
			
				|  |  | +      grpc_chttp2_flowctl_get_action(exec_ctx, &t->flow_control, NULL), t,
 | 
	
		
			
				|  |  | +      NULL);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    grpc_chttp2_initiate_write(exec_ctx, t,
 | 
	
		
			
				|  |  |                               GRPC_CHTTP2_INITIATE_WRITE_INITIAL_WRITE);
 | 
	
		
			
				|  |  |    post_benign_reclaimer(exec_ctx, t);
 | 
	
	
		
			
				|  | @@ -698,7 +677,7 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
 | 
	
		
			
				|  |  |    grpc_chttp2_incoming_metadata_buffer_init(&s->metadata_buffer[1], arena);
 | 
	
		
			
				|  |  |    grpc_chttp2_data_parser_init(&s->data_parser);
 | 
	
		
			
				|  |  |    grpc_slice_buffer_init(&s->flow_controlled_buffer);
 | 
	
		
			
				|  |  | -  s->deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC);
 | 
	
		
			
				|  |  | +  s->deadline = GRPC_MILLIS_INF_FUTURE;
 | 
	
		
			
				|  |  |    GRPC_CLOSURE_INIT(&s->complete_fetch_locked, complete_fetch_locked, s,
 | 
	
		
			
				|  |  |                      grpc_schedule_on_exec_ctx);
 | 
	
		
			
				|  |  |    grpc_slice_buffer_init(&s->unprocessed_incoming_frames_buffer);
 | 
	
	
		
			
				|  | @@ -902,9 +881,6 @@ static void inc_initiate_write_reason(
 | 
	
		
			
				|  |  |      case GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS:
 | 
	
		
			
				|  |  |        GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_SEND_SETTINGS(exec_ctx);
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  | -    case GRPC_CHTTP2_INITIATE_WRITE_BDP_ESTIMATOR_PING:
 | 
	
		
			
				|  |  | -      GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_BDP_ESTIMATOR_PING(exec_ctx);
 | 
	
		
			
				|  |  | -      break;
 | 
	
		
			
				|  |  |      case GRPC_CHTTP2_INITIATE_WRITE_FLOW_CONTROL_UNSTALLED_BY_SETTING:
 | 
	
		
			
				|  |  |        GRPC_STATS_INC_HTTP2_INITIATE_WRITE_DUE_TO_FLOW_CONTROL_UNSTALLED_BY_SETTING(
 | 
	
		
			
				|  |  |            exec_ctx);
 | 
	
	
		
			
				|  | @@ -1042,6 +1018,7 @@ static void write_action_begin_locked(grpc_exec_ctx *exec_ctx, void *gt,
 | 
	
		
			
				|  |  |                                                     write_action, t, scheduler),
 | 
	
		
			
				|  |  |                         GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  | +    GRPC_STATS_INC_HTTP2_SPURIOUS_WRITES_BEGUN(exec_ctx);
 | 
	
		
			
				|  |  |      set_write_state(exec_ctx, t, GRPC_CHTTP2_WRITE_STATE_IDLE,
 | 
	
		
			
				|  |  |                      "begin writing nothing");
 | 
	
		
			
				|  |  |      GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "writing");
 | 
	
	
		
			
				|  | @@ -1140,14 +1117,12 @@ void grpc_chttp2_add_incoming_goaway(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |      gpr_log(GPR_ERROR,
 | 
	
		
			
				|  |  |              "Received a GOAWAY with error code ENHANCE_YOUR_CALM and debug "
 | 
	
		
			
				|  |  |              "data equal to \"too_many_pings\"");
 | 
	
		
			
				|  |  | -    double current_keepalive_time_ms =
 | 
	
		
			
				|  |  | -        gpr_timespec_to_micros(t->keepalive_time) / 1000;
 | 
	
		
			
				|  |  | +    double current_keepalive_time_ms = (double)t->keepalive_time;
 | 
	
		
			
				|  |  |      t->keepalive_time =
 | 
	
		
			
				|  |  |          current_keepalive_time_ms > INT_MAX / KEEPALIVE_TIME_BACKOFF_MULTIPLIER
 | 
	
		
			
				|  |  | -            ? gpr_inf_future(GPR_TIMESPAN)
 | 
	
		
			
				|  |  | -            : gpr_time_from_millis((int64_t)(current_keepalive_time_ms *
 | 
	
		
			
				|  |  | -                                             KEEPALIVE_TIME_BACKOFF_MULTIPLIER),
 | 
	
		
			
				|  |  | -                                   GPR_TIMESPAN);
 | 
	
		
			
				|  |  | +            ? GRPC_MILLIS_INF_FUTURE
 | 
	
		
			
				|  |  | +            : (grpc_millis)(current_keepalive_time_ms *
 | 
	
		
			
				|  |  | +                            KEEPALIVE_TIME_BACKOFF_MULTIPLIER);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* lie: use transient failure from the transport to indicate goaway has been
 | 
	
	
		
			
				|  | @@ -1461,8 +1436,7 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op,
 | 
	
		
			
				|  |  |          t->settings[GRPC_PEER_SETTINGS]
 | 
	
		
			
				|  |  |                     [GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE];
 | 
	
		
			
				|  |  |      if (t->is_client) {
 | 
	
		
			
				|  |  | -      s->deadline =
 | 
	
		
			
				|  |  | -          gpr_time_min(s->deadline, s->send_initial_metadata->deadline);
 | 
	
		
			
				|  |  | +      s->deadline = GPR_MIN(s->deadline, s->send_initial_metadata->deadline);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      if (metadata_size > metadata_peer_limit) {
 | 
	
		
			
				|  |  |        grpc_chttp2_cancel_stream(
 | 
	
	
		
			
				|  | @@ -1646,8 +1620,8 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op,
 | 
	
		
			
				|  |  |              &t->flow_control, &s->flow_control, GRPC_HEADER_SIZE_IN_BYTES,
 | 
	
		
			
				|  |  |              already_received);
 | 
	
		
			
				|  |  |          grpc_chttp2_act_on_flowctl_action(
 | 
	
		
			
				|  |  | -            exec_ctx,
 | 
	
		
			
				|  |  | -            grpc_chttp2_flowctl_get_action(&t->flow_control, &s->flow_control),
 | 
	
		
			
				|  |  | +            exec_ctx, grpc_chttp2_flowctl_get_action(exec_ctx, &t->flow_control,
 | 
	
		
			
				|  |  | +                                                     &s->flow_control),
 | 
	
		
			
				|  |  |              t, s);
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -1680,16 +1654,14 @@ static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (!t->is_client) {
 | 
	
		
			
				|  |  |      if (op->send_initial_metadata) {
 | 
	
		
			
				|  |  | -      gpr_timespec deadline =
 | 
	
		
			
				|  |  | +      grpc_millis deadline =
 | 
	
		
			
				|  |  |            op->payload->send_initial_metadata.send_initial_metadata->deadline;
 | 
	
		
			
				|  |  | -      GPR_ASSERT(0 ==
 | 
	
		
			
				|  |  | -                 gpr_time_cmp(gpr_inf_future(deadline.clock_type), deadline));
 | 
	
		
			
				|  |  | +      GPR_ASSERT(deadline == GRPC_MILLIS_INF_FUTURE);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      if (op->send_trailing_metadata) {
 | 
	
		
			
				|  |  | -      gpr_timespec deadline =
 | 
	
		
			
				|  |  | +      grpc_millis deadline =
 | 
	
		
			
				|  |  |            op->payload->send_trailing_metadata.send_trailing_metadata->deadline;
 | 
	
		
			
				|  |  | -      GPR_ASSERT(0 ==
 | 
	
		
			
				|  |  | -                 gpr_time_cmp(gpr_inf_future(deadline.clock_type), deadline));
 | 
	
		
			
				|  |  | +      GPR_ASSERT(deadline == GRPC_MILLIS_INF_FUTURE);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1713,28 +1685,21 @@ static void cancel_pings(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                           grpc_error *error) {
 | 
	
		
			
				|  |  |    /* callback remaining pings: they're not allowed to call into the transpot,
 | 
	
		
			
				|  |  |       and maybe they hold resources that need to be freed */
 | 
	
		
			
				|  |  | -  for (size_t i = 0; i < GRPC_CHTTP2_PING_TYPE_COUNT; i++) {
 | 
	
		
			
				|  |  | -    grpc_chttp2_ping_queue *pq = &t->ping_queues[i];
 | 
	
		
			
				|  |  | -    for (size_t j = 0; j < GRPC_CHTTP2_PCL_COUNT; j++) {
 | 
	
		
			
				|  |  | -      grpc_closure_list_fail_all(&pq->lists[j], GRPC_ERROR_REF(error));
 | 
	
		
			
				|  |  | -      GRPC_CLOSURE_LIST_SCHED(exec_ctx, &pq->lists[j]);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +  grpc_chttp2_ping_queue *pq = &t->ping_queue;
 | 
	
		
			
				|  |  | +  for (size_t j = 0; j < GRPC_CHTTP2_PCL_COUNT; j++) {
 | 
	
		
			
				|  |  | +    grpc_closure_list_fail_all(&pq->lists[j], GRPC_ERROR_REF(error));
 | 
	
		
			
				|  |  | +    GRPC_CLOSURE_LIST_SCHED(exec_ctx, &pq->lists[j]);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    GRPC_ERROR_UNREF(error);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static void send_ping_locked(
 | 
	
		
			
				|  |  | -    grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  | -    grpc_chttp2_ping_type ping_type, grpc_closure *on_initiate,
 | 
	
		
			
				|  |  | -    grpc_closure *on_ack,
 | 
	
		
			
				|  |  | -    grpc_chttp2_initiate_write_reason initiate_write_reason) {
 | 
	
		
			
				|  |  | -  grpc_chttp2_ping_queue *pq = &t->ping_queues[ping_type];
 | 
	
		
			
				|  |  | +static void send_ping_locked(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  | +                             grpc_closure *on_initiate, grpc_closure *on_ack) {
 | 
	
		
			
				|  |  | +  grpc_chttp2_ping_queue *pq = &t->ping_queue;
 | 
	
		
			
				|  |  |    grpc_closure_list_append(&pq->lists[GRPC_CHTTP2_PCL_INITIATE], on_initiate,
 | 
	
		
			
				|  |  |                             GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  if (grpc_closure_list_append(&pq->lists[GRPC_CHTTP2_PCL_NEXT], on_ack,
 | 
	
		
			
				|  |  | -                               GRPC_ERROR_NONE)) {
 | 
	
		
			
				|  |  | -    grpc_chttp2_initiate_write(exec_ctx, t, initiate_write_reason);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +  grpc_closure_list_append(&pq->lists[GRPC_CHTTP2_PCL_NEXT], on_ack,
 | 
	
		
			
				|  |  | +                           GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void retry_initiate_ping_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
	
		
			
				|  | @@ -1749,8 +1714,7 @@ static void retry_initiate_ping_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void grpc_chttp2_ack_ping(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                            uint64_t id) {
 | 
	
		
			
				|  |  | -  grpc_chttp2_ping_queue *pq =
 | 
	
		
			
				|  |  | -      &t->ping_queues[id % GRPC_CHTTP2_PING_TYPE_COUNT];
 | 
	
		
			
				|  |  | +  grpc_chttp2_ping_queue *pq = &t->ping_queue;
 | 
	
		
			
				|  |  |    if (pq->inflight_id != id) {
 | 
	
		
			
				|  |  |      char *from = grpc_endpoint_get_peer(t->ep);
 | 
	
		
			
				|  |  |      gpr_log(GPR_DEBUG, "Unknown ping response from %s: %" PRIx64, from, id);
 | 
	
	
		
			
				|  | @@ -1769,8 +1733,8 @@ static void send_goaway(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |    t->sent_goaway_state = GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED;
 | 
	
		
			
				|  |  |    grpc_http2_error_code http_error;
 | 
	
		
			
				|  |  |    grpc_slice slice;
 | 
	
		
			
				|  |  | -  grpc_error_get_status(error, gpr_inf_future(GPR_CLOCK_MONOTONIC), NULL,
 | 
	
		
			
				|  |  | -                        &slice, &http_error);
 | 
	
		
			
				|  |  | +  grpc_error_get_status(exec_ctx, error, GRPC_MILLIS_INF_FUTURE, NULL, &slice,
 | 
	
		
			
				|  |  | +                        &http_error);
 | 
	
		
			
				|  |  |    grpc_chttp2_goaway_append(t->last_new_stream_id, (uint32_t)http_error,
 | 
	
		
			
				|  |  |                              grpc_slice_ref_internal(slice), &t->qbuf);
 | 
	
		
			
				|  |  |    grpc_chttp2_initiate_write(exec_ctx, t,
 | 
	
	
		
			
				|  | @@ -1780,7 +1744,7 @@ static void send_goaway(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void grpc_chttp2_add_ping_strike(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |                                   grpc_chttp2_transport *t) {
 | 
	
		
			
				|  |  | -  gpr_log(GPR_DEBUG, "PING strike");
 | 
	
		
			
				|  |  | +  t->ping_recv_state.ping_strikes++;
 | 
	
		
			
				|  |  |    if (++t->ping_recv_state.ping_strikes > t->ping_policy.max_ping_strikes &&
 | 
	
		
			
				|  |  |        t->ping_policy.max_ping_strikes != 0) {
 | 
	
		
			
				|  |  |      send_goaway(exec_ctx, t,
 | 
	
	
		
			
				|  | @@ -1820,9 +1784,9 @@ static void perform_transport_op_locked(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (op->send_ping) {
 | 
	
		
			
				|  |  | -    send_ping_locked(exec_ctx, t, GRPC_CHTTP2_PING_ON_NEXT_WRITE, NULL,
 | 
	
		
			
				|  |  | -                     op->send_ping,
 | 
	
		
			
				|  |  | -                     GRPC_CHTTP2_INITIATE_WRITE_APPLICATION_PING);
 | 
	
		
			
				|  |  | +    send_ping_locked(exec_ctx, t, NULL, op->send_ping);
 | 
	
		
			
				|  |  | +    grpc_chttp2_initiate_write(exec_ctx, t,
 | 
	
		
			
				|  |  | +                               GRPC_CHTTP2_INITIATE_WRITE_APPLICATION_PING);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (op->on_connectivity_state_change != NULL) {
 | 
	
	
		
			
				|  | @@ -2069,7 +2033,8 @@ void grpc_chttp2_cancel_stream(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |    if (!s->read_closed || !s->write_closed) {
 | 
	
		
			
				|  |  |      if (s->id != 0) {
 | 
	
		
			
				|  |  |        grpc_http2_error_code http_error;
 | 
	
		
			
				|  |  | -      grpc_error_get_status(due_to_error, s->deadline, NULL, NULL, &http_error);
 | 
	
		
			
				|  |  | +      grpc_error_get_status(exec_ctx, due_to_error, s->deadline, NULL, NULL,
 | 
	
		
			
				|  |  | +                            &http_error);
 | 
	
		
			
				|  |  |        grpc_slice_buffer_add(
 | 
	
		
			
				|  |  |            &t->qbuf, grpc_chttp2_rst_stream_create(s->id, (uint32_t)http_error,
 | 
	
		
			
				|  |  |                                                    &s->stats.outgoing));
 | 
	
	
		
			
				|  | @@ -2087,7 +2052,7 @@ void grpc_chttp2_fake_status(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                               grpc_chttp2_stream *s, grpc_error *error) {
 | 
	
		
			
				|  |  |    grpc_status_code status;
 | 
	
		
			
				|  |  |    grpc_slice slice;
 | 
	
		
			
				|  |  | -  grpc_error_get_status(error, s->deadline, &status, &slice, NULL);
 | 
	
		
			
				|  |  | +  grpc_error_get_status(exec_ctx, error, s->deadline, &status, &slice, NULL);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (status != GRPC_STATUS_OK) {
 | 
	
		
			
				|  |  |      s->seen_error = true;
 | 
	
	
		
			
				|  | @@ -2252,7 +2217,8 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |    uint32_t len = 0;
 | 
	
		
			
				|  |  |    grpc_status_code grpc_status;
 | 
	
		
			
				|  |  |    grpc_slice slice;
 | 
	
		
			
				|  |  | -  grpc_error_get_status(error, s->deadline, &grpc_status, &slice, NULL);
 | 
	
		
			
				|  |  | +  grpc_error_get_status(exec_ctx, error, s->deadline, &grpc_status, &slice,
 | 
	
		
			
				|  |  | +                        NULL);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    GPR_ASSERT(grpc_status >= 0 && (int)grpc_status < 100);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2469,10 +2435,8 @@ void grpc_chttp2_act_on_flowctl_action(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |    if (action.need_ping) {
 | 
	
		
			
				|  |  |      GRPC_CHTTP2_REF_TRANSPORT(t, "bdp_ping");
 | 
	
		
			
				|  |  |      grpc_bdp_estimator_schedule_ping(&t->flow_control.bdp_estimator);
 | 
	
		
			
				|  |  | -    send_ping_locked(exec_ctx, t,
 | 
	
		
			
				|  |  | -                     GRPC_CHTTP2_PING_BEFORE_TRANSPORT_WINDOW_UPDATE,
 | 
	
		
			
				|  |  | -                     &t->start_bdp_ping_locked, &t->finish_bdp_ping_locked,
 | 
	
		
			
				|  |  | -                     GRPC_CHTTP2_INITIATE_WRITE_BDP_ESTIMATOR_PING);
 | 
	
		
			
				|  |  | +    send_ping_locked(exec_ctx, t, &t->start_bdp_ping_locked,
 | 
	
		
			
				|  |  | +                     &t->finish_bdp_ping_locked);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2580,7 +2544,8 @@ static void read_action_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
		
			
				|  |  |      grpc_endpoint_read(exec_ctx, t->ep, &t->read_buffer,
 | 
	
		
			
				|  |  |                         &t->read_action_locked);
 | 
	
		
			
				|  |  |      grpc_chttp2_act_on_flowctl_action(
 | 
	
		
			
				|  |  | -        exec_ctx, grpc_chttp2_flowctl_get_bdp_action(&t->flow_control), t,
 | 
	
		
			
				|  |  | +        exec_ctx,
 | 
	
		
			
				|  |  | +        grpc_chttp2_flowctl_get_action(exec_ctx, &t->flow_control, NULL), t,
 | 
	
		
			
				|  |  |          NULL);
 | 
	
		
			
				|  |  |      GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "keep_reading");
 | 
	
		
			
				|  |  |    } else {
 | 
	
	
		
			
				|  | @@ -2613,7 +2578,7 @@ static void finish_bdp_ping_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
		
			
				|  |  |    if (GRPC_TRACER_ON(grpc_http_trace)) {
 | 
	
		
			
				|  |  |      gpr_log(GPR_DEBUG, "%s: Complete BDP ping", t->peer_string);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  grpc_bdp_estimator_complete_ping(&t->flow_control.bdp_estimator);
 | 
	
		
			
				|  |  | +  grpc_bdp_estimator_complete_ping(exec_ctx, &t->flow_control.bdp_estimator);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "bdp_ping");
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -2687,24 +2652,22 @@ static void init_keepalive_ping_locked(grpc_exec_ctx *exec_ctx, void *arg,
 | 
	
		
			
				|  |  |          grpc_chttp2_stream_map_size(&t->stream_map) > 0) {
 | 
	
		
			
				|  |  |        t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_PINGING;
 | 
	
		
			
				|  |  |        GRPC_CHTTP2_REF_TRANSPORT(t, "keepalive ping end");
 | 
	
		
			
				|  |  | -      send_ping_locked(exec_ctx, t, GRPC_CHTTP2_PING_ON_NEXT_WRITE,
 | 
	
		
			
				|  |  | -                       &t->start_keepalive_ping_locked,
 | 
	
		
			
				|  |  | -                       &t->finish_keepalive_ping_locked,
 | 
	
		
			
				|  |  | -                       GRPC_CHTTP2_INITIATE_WRITE_KEEPALIVE_PING);
 | 
	
		
			
				|  |  | +      send_ping_locked(exec_ctx, t, &t->start_keepalive_ping_locked,
 | 
	
		
			
				|  |  | +                       &t->finish_keepalive_ping_locked);
 | 
	
		
			
				|  |  | +      grpc_chttp2_initiate_write(exec_ctx, t,
 | 
	
		
			
				|  |  | +                                 GRPC_CHTTP2_INITIATE_WRITE_KEEPALIVE_PING);
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  |        GRPC_CHTTP2_REF_TRANSPORT(t, "init keepalive ping");
 | 
	
		
			
				|  |  | -      grpc_timer_init(
 | 
	
		
			
				|  |  | -          exec_ctx, &t->keepalive_ping_timer,
 | 
	
		
			
				|  |  | -          gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), t->keepalive_time),
 | 
	
		
			
				|  |  | -          &t->init_keepalive_ping_locked, gpr_now(GPR_CLOCK_MONOTONIC));
 | 
	
		
			
				|  |  | +      grpc_timer_init(exec_ctx, &t->keepalive_ping_timer,
 | 
	
		
			
				|  |  | +                      grpc_exec_ctx_now(exec_ctx) + t->keepalive_time,
 | 
	
		
			
				|  |  | +                      &t->init_keepalive_ping_locked);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    } else if (error == GRPC_ERROR_CANCELLED) {
 | 
	
		
			
				|  |  |      /* The keepalive ping timer may be cancelled by bdp */
 | 
	
		
			
				|  |  |      GRPC_CHTTP2_REF_TRANSPORT(t, "init keepalive ping");
 | 
	
		
			
				|  |  | -    grpc_timer_init(
 | 
	
		
			
				|  |  | -        exec_ctx, &t->keepalive_ping_timer,
 | 
	
		
			
				|  |  | -        gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), t->keepalive_time),
 | 
	
		
			
				|  |  | -        &t->init_keepalive_ping_locked, gpr_now(GPR_CLOCK_MONOTONIC));
 | 
	
		
			
				|  |  | +    grpc_timer_init(exec_ctx, &t->keepalive_ping_timer,
 | 
	
		
			
				|  |  | +                    grpc_exec_ctx_now(exec_ctx) + t->keepalive_time,
 | 
	
		
			
				|  |  | +                    &t->init_keepalive_ping_locked);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "init keepalive ping");
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -2713,10 +2676,9 @@ static void start_keepalive_ping_locked(grpc_exec_ctx *exec_ctx, void *arg,
 | 
	
		
			
				|  |  |                                          grpc_error *error) {
 | 
	
		
			
				|  |  |    grpc_chttp2_transport *t = (grpc_chttp2_transport *)arg;
 | 
	
		
			
				|  |  |    GRPC_CHTTP2_REF_TRANSPORT(t, "keepalive watchdog");
 | 
	
		
			
				|  |  | -  grpc_timer_init(
 | 
	
		
			
				|  |  | -      exec_ctx, &t->keepalive_watchdog_timer,
 | 
	
		
			
				|  |  | -      gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), t->keepalive_timeout),
 | 
	
		
			
				|  |  | -      &t->keepalive_watchdog_fired_locked, gpr_now(GPR_CLOCK_MONOTONIC));
 | 
	
		
			
				|  |  | +  grpc_timer_init(exec_ctx, &t->keepalive_watchdog_timer,
 | 
	
		
			
				|  |  | +                  grpc_exec_ctx_now(exec_ctx) + t->keepalive_time,
 | 
	
		
			
				|  |  | +                  &t->keepalive_watchdog_fired_locked);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void finish_keepalive_ping_locked(grpc_exec_ctx *exec_ctx, void *arg,
 | 
	
	
		
			
				|  | @@ -2727,10 +2689,9 @@ static void finish_keepalive_ping_locked(grpc_exec_ctx *exec_ctx, void *arg,
 | 
	
		
			
				|  |  |        t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_WAITING;
 | 
	
		
			
				|  |  |        grpc_timer_cancel(exec_ctx, &t->keepalive_watchdog_timer);
 | 
	
		
			
				|  |  |        GRPC_CHTTP2_REF_TRANSPORT(t, "init keepalive ping");
 | 
	
		
			
				|  |  | -      grpc_timer_init(
 | 
	
		
			
				|  |  | -          exec_ctx, &t->keepalive_ping_timer,
 | 
	
		
			
				|  |  | -          gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), t->keepalive_time),
 | 
	
		
			
				|  |  | -          &t->init_keepalive_ping_locked, gpr_now(GPR_CLOCK_MONOTONIC));
 | 
	
		
			
				|  |  | +      grpc_timer_init(exec_ctx, &t->keepalive_ping_timer,
 | 
	
		
			
				|  |  | +                      grpc_exec_ctx_now(exec_ctx) + t->keepalive_time,
 | 
	
		
			
				|  |  | +                      &t->init_keepalive_ping_locked);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "keepalive ping end");
 | 
	
	
		
			
				|  | @@ -2830,9 +2791,9 @@ static void incoming_byte_stream_next_locked(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |                                             bs->next_action.max_size_hint,
 | 
	
		
			
				|  |  |                                             cur_length);
 | 
	
		
			
				|  |  |      grpc_chttp2_act_on_flowctl_action(
 | 
	
		
			
				|  |  | -        exec_ctx,
 | 
	
		
			
				|  |  | -        grpc_chttp2_flowctl_get_action(&t->flow_control, &s->flow_control), t,
 | 
	
		
			
				|  |  | -        s);
 | 
	
		
			
				|  |  | +        exec_ctx, grpc_chttp2_flowctl_get_action(exec_ctx, &t->flow_control,
 | 
	
		
			
				|  |  | +                                                 &s->flow_control),
 | 
	
		
			
				|  |  | +        t, s);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    GPR_ASSERT(s->unprocessed_incoming_frames_buffer.length == 0);
 | 
	
		
			
				|  |  |    if (s->frame_storage.length > 0) {
 | 
	
	
		
			
				|  | @@ -3180,8 +3141,6 @@ const char *grpc_chttp2_initiate_write_reason_string(
 | 
	
		
			
				|  |  |        return "TRANSPORT_FLOW_CONTROL";
 | 
	
		
			
				|  |  |      case GRPC_CHTTP2_INITIATE_WRITE_SEND_SETTINGS:
 | 
	
		
			
				|  |  |        return "SEND_SETTINGS";
 | 
	
		
			
				|  |  | -    case GRPC_CHTTP2_INITIATE_WRITE_BDP_ESTIMATOR_PING:
 | 
	
		
			
				|  |  | -      return "BDP_ESTIMATOR_PING";
 | 
	
		
			
				|  |  |      case GRPC_CHTTP2_INITIATE_WRITE_FLOW_CONTROL_UNSTALLED_BY_SETTING:
 | 
	
		
			
				|  |  |        return "FLOW_CONTROL_UNSTALLED_BY_SETTING";
 | 
	
		
			
				|  |  |      case GRPC_CHTTP2_INITIATE_WRITE_FLOW_CONTROL_UNSTALLED_BY_UPDATE:
 |