| 
					
				 | 
			
			
				@@ -29,6 +29,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 extern "C" { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/ext/transport/chttp2/transport/internal.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "src/core/lib/iomgr/timer_manager.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "test/core/util/trickle_endpoint.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -45,6 +46,22 @@ DEFINE_int32(warmup_max_time_seconds, 10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace grpc { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace testing { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+gpr_atm g_now_us = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static gpr_timespec fake_now(gpr_clock_type clock_type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_timespec t; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_atm now = gpr_atm_no_barrier_load(&g_now_us); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  t.tv_sec = now / GPR_US_PER_SEC; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  t.tv_nsec = (now % GPR_US_PER_SEC) * GPR_NS_PER_US; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  t.clock_type = clock_type; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return t; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void inc_time() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_atm_no_barrier_fetch_add(&g_now_us, 100); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_timer_manager_tick(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void* tag(intptr_t x) { return reinterpret_cast<void*>(x); } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 template <class A0> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -158,6 +175,7 @@ class TrickledCHTTP2 : public EndpointPairFixture { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   void Step(bool update_stats) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    inc_time(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     size_t client_backlog = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         grpc_trickle_endpoint_trickle(&exec_ctx, endpoint_pair_.client); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     size_t server_backlog = 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -213,8 +231,7 @@ static void TrickleCQNext(TrickledCHTTP2* fixture, void** t, bool* ok, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   while (true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fixture->Log(iteration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     switch (fixture->cq()->AsyncNext( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        t, ok, gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            gpr_time_from_micros(100, GPR_TIMESPAN)))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        t, ok, gpr_inf_past(GPR_CLOCK_MONOTONIC))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       case CompletionQueue::TIMEOUT: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         fixture->Step(iteration != -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         break; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -289,9 +306,15 @@ static void BM_PumpStreamServerToClient_Trickle(benchmark::State& state) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       inner_loop(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     response_rw.Finish(Status::OK, tag(1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    need_tags = (1 << 0) | (1 << 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc::Status status; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request_rw->Finish(&status, tag(2)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    need_tags = (1 << 0) | (1 << 1) | (1 << 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     while (need_tags) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       TrickleCQNext(fixture.get(), &t, &ok, -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (t == tag(0) && ok) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        request_rw->Read(&recv_response, tag(0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       int i = (int)(intptr_t)t; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       GPR_ASSERT(need_tags & (1 << i)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       need_tags &= ~(1 << i); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -419,8 +442,12 @@ BENCHMARK(BM_PumpUnbalancedUnary_Trickle)->Apply(UnaryTrickleArgs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+extern "C" gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int main(int argc, char** argv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ::benchmark::Initialize(&argc, argv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ::grpc::testing::InitTest(&argc, &argv, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_timer_manager_set_threading(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_now_impl = ::grpc::testing::fake_now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ::benchmark::RunSpecifiedBenchmarks(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |