| 
					
				 | 
			
			
				@@ -69,19 +69,27 @@ class CredentialsProvider { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class DefaultCredentialsProvider : public CredentialsProvider { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ~DefaultCredentialsProvider() override {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ~DefaultCredentialsProvider() GRPC_OVERRIDE {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  void AddSecureType( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const grpc::string& type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      std::unique_ptr<CredentialTypeProvider> type_provider) override { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  void AddSecureType(const grpc::string& type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                     std::unique_ptr<CredentialTypeProvider> type_provider) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      GRPC_OVERRIDE { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // This clobbers any existing entry for type, except the defaults, which 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // can't be clobbered. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc::unique_lock<grpc::mutex> lock(mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    added_secure_types_[type] = std::move(type_provider); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto it = std::find(added_secure_type_names_.begin(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        added_secure_type_names_.end(), type); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (it == added_secure_type_names_.end()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      added_secure_type_names_.push_back(type); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      added_secure_type_providers_.push_back(std::move(type_provider)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      added_secure_type_providers_[it - added_secure_type_names_.begin()] = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          std::move(type_provider); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::shared_ptr<ChannelCredentials> GetChannelCredentials( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const grpc::string& type, ChannelArguments* args) override { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const grpc::string& type, ChannelArguments* args) GRPC_OVERRIDE { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (type == grpc::testing::kInsecureCredentialsType) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return InsecureChannelCredentials(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else if (type == grpc::testing::kTlsCredentialsType) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -90,17 +98,19 @@ class DefaultCredentialsProvider : public CredentialsProvider { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return SslCredentials(ssl_opts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       grpc::unique_lock<grpc::mutex> lock(mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      auto it(added_secure_types_.find(type)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (it == added_secure_types_.end()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      auto it(std::find(added_secure_type_names_.begin(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        added_secure_type_names_.end(), type)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (it == added_secure_type_names_.end()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         gpr_log(GPR_ERROR, "Unsupported credentials type %s.", type.c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return grpc::nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return it->second->GetChannelCredentials(args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return added_secure_type_providers_[it - added_secure_type_names_.begin()] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          ->GetChannelCredentials(args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::shared_ptr<ServerCredentials> GetServerCredentials( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const grpc::string& type) override { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const grpc::string& type) GRPC_OVERRIDE { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (type == grpc::testing::kInsecureCredentialsType) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return InsecureServerCredentials(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else if (type == grpc::testing::kTlsCredentialsType) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -112,32 +122,36 @@ class DefaultCredentialsProvider : public CredentialsProvider { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return SslServerCredentials(ssl_opts); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       grpc::unique_lock<grpc::mutex> lock(mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      auto it(added_secure_types_.find(type)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (it == added_secure_types_.end()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      auto it(std::find(added_secure_type_names_.begin(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        added_secure_type_names_.end(), type)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (it == added_secure_type_names_.end()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         gpr_log(GPR_ERROR, "Unsupported credentials type %s.", type.c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return grpc::nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return it->second->GetServerCredentials(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return added_secure_type_providers_[it - added_secure_type_names_.begin()] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          ->GetServerCredentials(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::vector<grpc::string> GetSecureCredentialsTypeList() override { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::vector<grpc::string> GetSecureCredentialsTypeList() GRPC_OVERRIDE { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     std::vector<grpc::string> types; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     types.push_back(grpc::testing::kTlsCredentialsType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc::unique_lock<grpc::mutex> lock(mu_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (const auto& type_pair : added_secure_types_) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      types.push_back(type_pair.first); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (auto it = added_secure_type_names_.begin(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         it != added_secure_type_names_.end(); it++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      types.push_back(*it); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return types; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  private: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc::mutex mu_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::unordered_map<grpc::string, std::unique_ptr<CredentialTypeProvider> > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      added_secure_types_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::vector<grpc::string> added_secure_type_names_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::vector<std::unique_ptr<CredentialTypeProvider>> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      added_secure_type_providers_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 gpr_once g_once_init_provider = GPR_ONCE_INIT; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-CredentialsProvider* g_provider = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+CredentialsProvider* g_provider = grpc::nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void CreateDefaultProvider() { g_provider = new DefaultCredentialsProvider; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |