|  | @@ -91,8 +91,9 @@ static void read_action_locked(grpc_exec_ctx *exec_ctx, void *t,
 | 
	
		
			
				|  |  |  static void complete_fetch_locked(grpc_exec_ctx *exec_ctx, void *gs,
 | 
	
		
			
				|  |  |                                    grpc_error *error);
 | 
	
		
			
				|  |  |  /** Set a transport level setting, and push it to our peer */
 | 
	
		
			
				|  |  | -static void push_setting(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  | -                         grpc_chttp2_setting_id id, uint32_t value);
 | 
	
		
			
				|  |  | +static void queue_setting_update(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  | +                                 grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  | +                                 grpc_chttp2_setting_id id, uint32_t value);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                             grpc_chttp2_stream *s, grpc_error *error);
 | 
	
	
		
			
				|  | @@ -342,15 +343,16 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* configure http2 the way we like it */
 | 
	
		
			
				|  |  |    if (is_client) {
 | 
	
		
			
				|  |  | -    push_setting(exec_ctx, t, GRPC_CHTTP2_SETTINGS_ENABLE_PUSH, 0);
 | 
	
		
			
				|  |  | -    push_setting(exec_ctx, t, GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 0);
 | 
	
		
			
				|  |  | +    queue_setting_update(exec_ctx, t, GRPC_CHTTP2_SETTINGS_ENABLE_PUSH, 0);
 | 
	
		
			
				|  |  | +    queue_setting_update(exec_ctx, t,
 | 
	
		
			
				|  |  | +                         GRPC_CHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 0);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  push_setting(exec_ctx, t, GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
 | 
	
		
			
				|  |  | -               DEFAULT_WINDOW);
 | 
	
		
			
				|  |  | -  push_setting(exec_ctx, t, GRPC_CHTTP2_SETTINGS_MAX_HEADER_LIST_SIZE,
 | 
	
		
			
				|  |  | -               DEFAULT_MAX_HEADER_LIST_SIZE);
 | 
	
		
			
				|  |  | -  push_setting(exec_ctx, t,
 | 
	
		
			
				|  |  | -               GRPC_CHTTP2_SETTINGS_GRPC_ALLOW_TRUE_BINARY_METADATA, 1);
 | 
	
		
			
				|  |  | +  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 = (grpc_chttp2_repeated_ping_policy){
 | 
	
		
			
				|  |  |        .max_pings_without_data = DEFAULT_MAX_PINGS_BETWEEN_DATA,
 | 
	
	
		
			
				|  | @@ -517,8 +519,8 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |                int value = grpc_channel_arg_get_integer(
 | 
	
		
			
				|  |  |                    &channel_args->args[i], settings_map[j].integer_options);
 | 
	
		
			
				|  |  |                if (value >= 0) {
 | 
	
		
			
				|  |  | -                push_setting(exec_ctx, t, settings_map[j].setting_id,
 | 
	
		
			
				|  |  | -                             (uint32_t)value);
 | 
	
		
			
				|  |  | +                queue_setting_update(exec_ctx, t, settings_map[j].setting_id,
 | 
	
		
			
				|  |  | +                                     (uint32_t)value);
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              break;
 | 
	
	
		
			
				|  | @@ -929,8 +931,11 @@ static void write_action_end_locked(grpc_exec_ctx *exec_ctx, void *tp,
 | 
	
		
			
				|  |  |    GPR_TIMER_END("terminate_writing_with_lock", 0);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static void push_setting(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  | -                         grpc_chttp2_setting_id id, uint32_t value) {
 | 
	
		
			
				|  |  | +// Dirties an HTTP2 setting to be sent out next time a writing path occurs.
 | 
	
		
			
				|  |  | +// If the change needs to occur immediately, manually initiate a write.
 | 
	
		
			
				|  |  | +static void queue_setting_update(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  | +                                 grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  | +                                 grpc_chttp2_setting_id id, uint32_t value) {
 | 
	
		
			
				|  |  |    const grpc_chttp2_setting_parameters *sp =
 | 
	
		
			
				|  |  |        &grpc_chttp2_settings_parameters[id];
 | 
	
		
			
				|  |  |    uint32_t use_value = GPR_CLAMP(value, sp->min_value, sp->max_value);
 | 
	
	
		
			
				|  | @@ -941,7 +946,6 @@ static void push_setting(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |    if (use_value != t->settings[GRPC_LOCAL_SETTINGS][id]) {
 | 
	
		
			
				|  |  |      t->settings[GRPC_LOCAL_SETTINGS][id] = use_value;
 | 
	
		
			
				|  |  |      t->dirtied_local_settings = 1;
 | 
	
		
			
				|  |  | -    grpc_chttp2_initiate_write(exec_ctx, t, "push_setting");
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2107,8 +2111,8 @@ static void update_bdp(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |      gpr_log(GPR_DEBUG, "%s: update initial window size to %d", t->peer_string,
 | 
	
		
			
				|  |  |              (int)bdp);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  push_setting(exec_ctx, t, GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
 | 
	
		
			
				|  |  | -               (uint32_t)bdp);
 | 
	
		
			
				|  |  | +  queue_setting_update(exec_ctx, t, GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE,
 | 
	
		
			
				|  |  | +                       (uint32_t)bdp);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void update_frame(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
	
		
			
				|  | @@ -2127,8 +2131,8 @@ static void update_frame(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
 | 
	
		
			
				|  |  |      gpr_log(GPR_DEBUG, "%s: update max_frame size to %d", t->peer_string,
 | 
	
		
			
				|  |  |              (int)frame_size);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  push_setting(exec_ctx, t, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
 | 
	
		
			
				|  |  | -               (uint32_t)frame_size);
 | 
	
		
			
				|  |  | +  queue_setting_update(exec_ctx, t, GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE,
 | 
	
		
			
				|  |  | +                       (uint32_t)frame_size);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static grpc_error *try_http_parsing(grpc_exec_ctx *exec_ctx,
 |