|  | @@ -28,6 +28,7 @@
 | 
	
		
			
				|  |  |  #include "src/core/lib/channel/handshaker.h"
 | 
	
		
			
				|  |  |  #include "src/core/lib/debug/trace.h"
 | 
	
		
			
				|  |  |  #include "src/core/lib/iomgr/timer.h"
 | 
	
		
			
				|  |  | +#include "src/core/lib/slice/slice_internal.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  grpc_core::TraceFlag grpc_handshaker_trace(false, "handshaker");
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -220,8 +221,26 @@ static bool call_next_handshaker_locked(grpc_handshake_manager* mgr,
 | 
	
		
			
				|  |  |    // callback.  Otherwise, call the next handshaker.
 | 
	
		
			
				|  |  |    if (error != GRPC_ERROR_NONE || mgr->shutdown || mgr->args.exit_early ||
 | 
	
		
			
				|  |  |        mgr->index == mgr->count) {
 | 
	
		
			
				|  |  | +    if (error == GRPC_ERROR_NONE && mgr->shutdown) {
 | 
	
		
			
				|  |  | +      error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("handshaker shutdown");
 | 
	
		
			
				|  |  | +      // TODO(roth): It is currently necessary to shutdown endpoints
 | 
	
		
			
				|  |  | +      // before destroying then, even when we know that there are no
 | 
	
		
			
				|  |  | +      // pending read/write callbacks.  This should be fixed, at which
 | 
	
		
			
				|  |  | +      // point this can be removed.
 | 
	
		
			
				|  |  | +      grpc_endpoint_shutdown(mgr->args.endpoint, GRPC_ERROR_REF(error));
 | 
	
		
			
				|  |  | +      grpc_endpoint_destroy(mgr->args.endpoint);
 | 
	
		
			
				|  |  | +      mgr->args.endpoint = nullptr;
 | 
	
		
			
				|  |  | +      grpc_channel_args_destroy(mgr->args.args);
 | 
	
		
			
				|  |  | +      mgr->args.args = nullptr;
 | 
	
		
			
				|  |  | +      grpc_slice_buffer_destroy_internal(mgr->args.read_buffer);
 | 
	
		
			
				|  |  | +      gpr_free(mgr->args.read_buffer);
 | 
	
		
			
				|  |  | +      mgr->args.read_buffer = nullptr;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      if (grpc_handshaker_trace.enabled()) {
 | 
	
		
			
				|  |  | -      gpr_log(GPR_INFO, "handshake_manager %p: handshaking complete", mgr);
 | 
	
		
			
				|  |  | +      gpr_log(GPR_INFO,
 | 
	
		
			
				|  |  | +              "handshake_manager %p: handshaking complete -- scheduling "
 | 
	
		
			
				|  |  | +              "on_handshake_done with error=%s",
 | 
	
		
			
				|  |  | +              mgr, grpc_error_string(error));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      // Cancel deadline timer, since we're invoking the on_handshake_done
 | 
	
		
			
				|  |  |      // callback now.
 |