Use only some of the thread pool threads for gRPC
diff --git a/src/node/ext/completion_queue_async_worker.cc b/src/node/ext/completion_queue_async_worker.cc
index 8de7db6..8db7229 100644
--- a/src/node/ext/completion_queue_async_worker.cc
+++ b/src/node/ext/completion_queue_async_worker.cc
@@ -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 @@
grpc_completion_queue *CompletionQueueAsyncWorker::queue;
+int CompletionQueueAsyncWorker::current_threads;
+int CompletionQueueAsyncWorker::waiting_next_calls;
+
CompletionQueueAsyncWorker::CompletionQueueAsyncWorker()
: NanAsyncWorker(NULL) {}
@@ -64,17 +69,30 @@
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)};