Преглед изворни кода

Fix race in poll() based pollset

It was possible for entries in watchers[] to be deleted by another thread before we called begin_poll.

I'd like to do something nicer than this eventually... but that'll be easier once we've got the polling loop cleaned up (which is currently WIP)
Craig Tiller пре 10 година
родитељ
комит
b3320fc7c3
1 измењених фајлова са 4 додато и 1 уклоњено
  1. 4 1
      src/core/iomgr/pollset_multipoller_with_poll_posix.c

+ 4 - 1
src/core/iomgr/pollset_multipoller_with_poll_posix.c

@@ -122,6 +122,7 @@ static void multipoll_with_poll_pollset_maybe_work_and_unlock(
     } else {
     } else {
       h->fds[fd_count++] = h->fds[i];
       h->fds[fd_count++] = h->fds[i];
       watchers[pfd_count].fd = h->fds[i];
       watchers[pfd_count].fd = h->fds[i];
+      GRPC_FD_REF(watchers[pfd_count].fd, "multipoller_start");
       pfds[pfd_count].fd = h->fds[i]->fd;
       pfds[pfd_count].fd = h->fds[i]->fd;
       pfds[pfd_count].revents = 0;
       pfds[pfd_count].revents = 0;
       pfd_count++;
       pfd_count++;
@@ -135,8 +136,10 @@ static void multipoll_with_poll_pollset_maybe_work_and_unlock(
   gpr_mu_unlock(&pollset->mu);
   gpr_mu_unlock(&pollset->mu);
 
 
   for (i = 2; i < pfd_count; i++) {
   for (i = 2; i < pfd_count; i++) {
-    pfds[i].events = (short)grpc_fd_begin_poll(watchers[i].fd, pollset, worker,
+    grpc_fd *fd = watchers[i].fd;
+    pfds[i].events = (short)grpc_fd_begin_poll(fd, pollset, worker,
                                                POLLIN, POLLOUT, &watchers[i]);
                                                POLLIN, POLLOUT, &watchers[i]);
+    GRPC_FD_UNREF(fd, "multipoller_start");
   }
   }
 
 
   /* TODO(vpai): Consider first doing a 0 timeout poll here to avoid
   /* TODO(vpai): Consider first doing a 0 timeout poll here to avoid