|  | @@ -43,6 +43,8 @@
 | 
	
		
			
				|  |  |  namespace grpc {
 | 
	
		
			
				|  |  |  namespace node {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +const int max_queue_threads = 2;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  using v8::Function;
 | 
	
		
			
				|  |  |  using v8::Handle;
 | 
	
		
			
				|  |  |  using v8::Object;
 | 
	
	
		
			
				|  | @@ -51,6 +53,9 @@ using v8::Value;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  grpc_completion_queue *CompletionQueueAsyncWorker::queue;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +int CompletionQueueAsyncWorker::current_threads;
 | 
	
		
			
				|  |  | +int CompletionQueueAsyncWorker::waiting_next_calls;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  CompletionQueueAsyncWorker::CompletionQueueAsyncWorker()
 | 
	
		
			
				|  |  |      : NanAsyncWorker(NULL) {}
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -64,17 +69,30 @@ grpc_completion_queue *CompletionQueueAsyncWorker::GetQueue() { return queue; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void CompletionQueueAsyncWorker::Next() {
 | 
	
		
			
				|  |  |    NanScope();
 | 
	
		
			
				|  |  | -  CompletionQueueAsyncWorker *worker = new CompletionQueueAsyncWorker();
 | 
	
		
			
				|  |  | -  NanAsyncQueueWorker(worker);
 | 
	
		
			
				|  |  | +  if (current_threads < max_queue_threads) {
 | 
	
		
			
				|  |  | +    CompletionQueueAsyncWorker *worker = new CompletionQueueAsyncWorker();
 | 
	
		
			
				|  |  | +    NanAsyncQueueWorker(worker);
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    waiting_next_calls += 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void CompletionQueueAsyncWorker::Init(Handle<Object> exports) {
 | 
	
		
			
				|  |  |    NanScope();
 | 
	
		
			
				|  |  | +  current_threads = 0;
 | 
	
		
			
				|  |  | +  waiting_next_calls = 0;
 | 
	
		
			
				|  |  |    queue = grpc_completion_queue_create();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void CompletionQueueAsyncWorker::HandleOKCallback() {
 | 
	
		
			
				|  |  |    NanScope();
 | 
	
		
			
				|  |  | +  if (waiting_next_calls > 0) {
 | 
	
		
			
				|  |  | +    waiting_next_calls -= 1;
 | 
	
		
			
				|  |  | +    CompletionQueueAsyncWorker *worker = new CompletionQueueAsyncWorker();
 | 
	
		
			
				|  |  | +    NanAsyncQueueWorker(worker);
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    current_threads -= 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    NanCallback event_callback(GetTagHandle(result->tag).As<Function>());
 | 
	
		
			
				|  |  |    Handle<Value> argv[] = {CreateEventObject(result)};
 | 
	
		
			
				|  |  |  
 |