| 
					
				 | 
			
			
				@@ -99,12 +99,15 @@ class AsyncQpsServerTest : public Server { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         while (srv_cq_->Next(&got_tag, &ok)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           ServerRpcContext *ctx = detag(got_tag); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           // The tag is a pointer to an RPC context to invoke 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if (ctx->RunNextState(ok) == false) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          bool still_going = ctx->RunNextState(ok); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          std::lock_guard<std::mutex> g(shutdown_mutex_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if (!shutdown_) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             // this RPC context is done, so refresh it 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            std::lock_guard<std::mutex> g(shutdown_mutex_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (!shutdown_) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!still_going) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               ctx->Reset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -116,11 +119,15 @@ class AsyncQpsServerTest : public Server { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       std::lock_guard<std::mutex> g(shutdown_mutex_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       shutdown_ = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      srv_cq_->Shutdown(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for (auto thr = threads_.begin(); thr != threads_.end(); thr++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       thr->join(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    srv_cq_->Shutdown(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    bool ok; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    void *got_tag; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    while (srv_cq_->Next(&got_tag, &ok)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     while (!contexts_.empty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       delete contexts_.front(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       contexts_.pop_front(); 
			 |