| 
					
				 | 
			
			
				@@ -72,29 +72,31 @@ struct call_data { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     GRPC_CLOSURE_INIT(&start_send_message_batch_in_call_combiner, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                       start_send_message_batch, elem, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                       grpc_schedule_on_exec_ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_slice_buffer_init(&slices); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GRPC_CLOSURE_INIT(&send_message_on_complete, ::send_message_on_complete, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                      elem, grpc_schedule_on_exec_ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GRPC_CLOSURE_INIT(&on_send_message_next_done, ::on_send_message_next_done, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                      elem, grpc_schedule_on_exec_ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ~call_data() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_slice_buffer_destroy_internal(&slices); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (state_initialized) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      grpc_slice_buffer_destroy_internal(&slices); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     GRPC_ERROR_UNREF(cancel_error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_core::CallCombiner* call_combiner; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_linked_mdelem message_compression_algorithm_storage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_linked_mdelem stream_compression_algorithm_storage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_linked_mdelem accept_encoding_storage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_linked_mdelem accept_stream_encoding_storage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_message_compression_algorithm message_compression_algorithm = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       GRPC_MESSAGE_COMPRESS_NONE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  bool seen_initial_metadata = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_error* cancel_error = GRPC_ERROR_NONE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_closure start_send_message_batch_in_call_combiner; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_transport_stream_op_batch* send_message_batch = nullptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  bool seen_initial_metadata = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* Set to true, if the fields below are initialized. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  bool state_initialized = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_closure start_send_message_batch_in_call_combiner; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* The fields below are only initialized when we compress the payload. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * Keep them at the bottom of the struct, so they don't pollute the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * cache-lines. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_linked_mdelem message_compression_algorithm_storage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_linked_mdelem stream_compression_algorithm_storage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_linked_mdelem accept_encoding_storage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_linked_mdelem accept_stream_encoding_storage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_slice_buffer slices; /**< Buffers up input slices to be compressed */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       replacement_stream; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -157,6 +159,18 @@ static grpc_compression_algorithm find_compression_algorithm( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return GRPC_COMPRESS_NONE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void initialize_state(grpc_call_element* elem, call_data* calld) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_DEBUG_ASSERT(!calld->state_initialized); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  calld->state_initialized = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_slice_buffer_init(&calld->slices); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPC_CLOSURE_INIT(&calld->send_message_on_complete, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ::send_message_on_complete, elem, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    grpc_schedule_on_exec_ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GRPC_CLOSURE_INIT(&calld->on_send_message_next_done, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ::on_send_message_next_done, elem, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    grpc_schedule_on_exec_ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static grpc_error* process_send_initial_metadata( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc_call_element* elem, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc_metadata_batch* initial_metadata) GRPC_MUST_USE_RESULT; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -177,11 +191,13 @@ static grpc_error* process_send_initial_metadata( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Hint compression algorithm. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_error* error = GRPC_ERROR_NONE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (calld->message_compression_algorithm != GRPC_MESSAGE_COMPRESS_NONE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    initialize_state(elem, calld); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     error = grpc_metadata_batch_add_tail( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         initial_metadata, &calld->message_compression_algorithm_storage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         grpc_message_compression_encoding_mdelem( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             calld->message_compression_algorithm)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } else if (stream_compression_algorithm != GRPC_STREAM_COMPRESS_NONE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    initialize_state(elem, calld); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     error = grpc_metadata_batch_add_tail( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         initial_metadata, &calld->stream_compression_algorithm_storage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         grpc_stream_compression_encoding_mdelem(stream_compression_algorithm)); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -225,6 +241,8 @@ static void send_message_batch_continue(grpc_call_element* elem) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void finish_send_message(grpc_call_element* elem) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   call_data* calld = static_cast<call_data*>(elem->call_data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_DEBUG_ASSERT(calld->message_compression_algorithm != 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   GRPC_MESSAGE_COMPRESS_NONE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Compress the data if appropriate. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_slice_buffer tmp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_slice_buffer_init(&tmp); 
			 |