| 
					
				 | 
			
			
				@@ -38,23 +38,19 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <string.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/* Initial number of operations to allocate */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define INITIAL_SLOTS 8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* Exponential growth function: Given x, return a larger x. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   Currently we grow by 1.5 times upon reallocation. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   Assumes INITIAL_SLOTS > 1 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   Currently we grow by 1.5 times upon reallocation. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define GROW(x) (3 * (x) / 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void grpc_sopb_init(grpc_stream_op_buffer *sopb) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  sopb->ops = gpr_malloc(sizeof(grpc_stream_op) * INITIAL_SLOTS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  GPR_ASSERT(sopb->ops); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  sopb->ops = sopb->inlined_ops; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   sopb->nops = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  sopb->capacity = INITIAL_SLOTS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  sopb->capacity = GRPC_SOPB_INLINE_ELEMENTS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void grpc_sopb_destroy(grpc_stream_op_buffer *sopb) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_stream_ops_unref_owned_objects(sopb->ops, sopb->nops); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_free(sopb->ops); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (sopb->ops != sopb->inlined_ops) gpr_free(sopb->ops); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void grpc_sopb_reset(grpc_stream_op_buffer *sopb) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -62,6 +58,19 @@ void grpc_sopb_reset(grpc_stream_op_buffer *sopb) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   sopb->nops = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void grpc_sopb_swap(grpc_stream_op_buffer *a, grpc_stream_op_buffer *b) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_stream_op_buffer temp = *a; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  *a = *b; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  *b = temp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (a->ops == b->inlined_ops) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    a->ops = a->inlined_ops; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (b->ops == a->inlined_ops) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    b->ops = b->inlined_ops; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void grpc_stream_ops_unref_owned_objects(grpc_stream_op *ops, size_t nops) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   size_t i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (i = 0; i < nops; i++) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -84,17 +93,21 @@ void grpc_stream_ops_unref_owned_objects(grpc_stream_op *ops, size_t nops) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void expand(grpc_stream_op_buffer *sopb) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  sopb->capacity = GROW(sopb->capacity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  sopb->ops = gpr_realloc(sopb->ops, sizeof(grpc_stream_op) * sopb->capacity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  GPR_ASSERT(sopb->ops); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void expandto(grpc_stream_op_buffer *sopb, size_t new_capacity) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  sopb->capacity = new_capacity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (sopb->ops == sopb->inlined_ops) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    sopb->ops = gpr_malloc(sizeof(grpc_stream_op) * new_capacity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    memcpy(sopb->ops, sopb->inlined_ops, sopb->nops * sizeof(grpc_stream_op)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    sopb->ops = gpr_realloc(sopb->ops, sizeof(grpc_stream_op) * new_capacity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static grpc_stream_op *add(grpc_stream_op_buffer *sopb) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_stream_op *out; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (sopb->nops == sopb->capacity) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    expand(sopb); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expandto(sopb, GROW(sopb->capacity)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   out = sopb->ops + sopb->nops; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   sopb->nops++; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -152,12 +165,7 @@ void grpc_sopb_append(grpc_stream_op_buffer *sopb, grpc_stream_op *ops, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   size_t new_nops = orig_nops + nops; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (new_nops > sopb->capacity) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    size_t new_capacity = GROW(sopb->capacity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (new_capacity < new_nops) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      new_capacity = new_nops; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    sopb->ops = gpr_realloc(sopb->ops, sizeof(grpc_stream_op) * new_capacity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    sopb->capacity = new_capacity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expandto(sopb, GPR_MAX(GROW(sopb->capacity), new_nops)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   memcpy(sopb->ops + orig_nops, ops, sizeof(grpc_stream_op) * nops); 
			 |