| 
					
				 | 
			
			
				@@ -830,44 +830,45 @@ static void read_service_config(grpc_exec_ctx *exec_ctx, void *arg, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   channel_data *chand = elem->channel_data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   call_data *calld = elem->call_data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // If this is an error, there's no point in looking at the service config. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (error != GRPC_ERROR_NONE) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Get the method config table from channel data. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_mu_lock(&chand->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_method_config_table *method_config_table = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (chand->method_config_table != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    method_config_table = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        grpc_method_config_table_ref(chand->method_config_table); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_mu_unlock(&chand->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // If the method config table was present, use it. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (method_config_table != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const grpc_method_config *method_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        grpc_method_config_table_get_method_config(method_config_table, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                   calld->path); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (method_config != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const gpr_timespec *per_method_timeout = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          grpc_method_config_get_timeout(method_config); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const bool *wait_for_ready = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          grpc_method_config_get_wait_for_ready(method_config); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (per_method_timeout != NULL || wait_for_ready != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        gpr_mu_lock(&calld->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (per_method_timeout != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          gpr_timespec per_method_deadline = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              gpr_time_add(calld->call_start_time, *per_method_timeout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (gpr_time_cmp(per_method_deadline, calld->deadline) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            calld->deadline = per_method_deadline; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // Reset deadline timer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            grpc_deadline_state_reset(exec_ctx, elem, calld->deadline); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (error == GRPC_ERROR_NONE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // Get the method config table from channel data. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    gpr_mu_lock(&chand->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_method_config_table *method_config_table = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (chand->method_config_table != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      method_config_table = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          grpc_method_config_table_ref(chand->method_config_table); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    gpr_mu_unlock(&chand->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // If the method config table was present, use it. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (method_config_table != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const grpc_method_config *method_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          grpc_method_config_table_get_method_config(method_config_table, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                     calld->path); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (method_config != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const gpr_timespec *per_method_timeout = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            grpc_method_config_get_timeout(method_config); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const bool *wait_for_ready = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            grpc_method_config_get_wait_for_ready(method_config); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (per_method_timeout != NULL || wait_for_ready != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          gpr_mu_lock(&calld->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if (per_method_timeout != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            gpr_timespec per_method_deadline = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                gpr_time_add(calld->call_start_time, *per_method_timeout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (gpr_time_cmp(per_method_deadline, calld->deadline) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              calld->deadline = per_method_deadline; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // Reset deadline timer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              grpc_deadline_state_reset(exec_ctx, elem, calld->deadline); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if (wait_for_ready != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            calld->wait_for_ready_from_service_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                *wait_for_ready ? WAIT_FOR_READY_TRUE : WAIT_FOR_READY_FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          gpr_mu_unlock(&calld->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (wait_for_ready != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          calld->wait_for_ready_from_service_config = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              *wait_for_ready ? WAIT_FOR_READY_TRUE : WAIT_FOR_READY_FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        gpr_mu_unlock(&calld->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      grpc_method_config_table_unref(method_config_table); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_method_config_table_unref(method_config_table); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   GRPC_CALL_STACK_UNREF(exec_ctx, calld->owning_call, "read_service_config"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |