From dc6e86bb7ac28822fe72394a5cf4ebb5d5a9be32 Mon Sep 17 00:00:00 2001
From: Craig Tiller <craig.tiller@gmail.com>
Date: Fri, 15 May 2015 17:11:44 -0700
Subject: [PATCH] Kick the tire down the road instead of blocking to free up
 threads

---
 src/core/iomgr/pollset_posix.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c
index 4d1bcad9e2..ab1af0d4ee 100644
--- a/src/core/iomgr/pollset_posix.c
+++ b/src/core/iomgr/pollset_posix.c
@@ -258,7 +258,6 @@ static void unary_poll_do_promote(void *args, int success) {
   grpc_pollset *pollset = up_args->pollset;
   grpc_fd *fd = up_args->fd;
   int do_shutdown_cb = 0;
-  gpr_free(up_args);
 
   /*
    * This is quite tricky. There are a number of cases to keep in mind here:
@@ -273,8 +272,12 @@ static void unary_poll_do_promote(void *args, int success) {
   /* First we need to ensure that nobody is polling concurrently */
   while (pollset->counter != 0) {
     grpc_pollset_kick(pollset);
-    gpr_cv_wait(&pollset->cv, &pollset->mu, gpr_inf_future);
+    grpc_iomgr_add_callback(unary_poll_do_promote, up_args);
+    gpr_mu_unlock(&pollset->mu);
+    return;
   }
+
+  gpr_free(up_args);
   /* At this point the pollset may no longer be a unary poller. In that case
    * we should just call the right add function and be done. */
   /* TODO(klempner): If we're not careful this could cause infinite recursion.
-- 
GitLab