Ejemplo n.º 1
0
void grpc_fd_end_poll(grpc_fd_watcher *watcher, int got_read, int got_write) {
  int was_polling = 0;
  int kick = 0;
  grpc_fd *fd = watcher->fd;

  gpr_mu_lock(&fd->watcher_mu);
  if (watcher == fd->read_watcher) {
    /* remove read watcher, kick if we still need a read */
    was_polling = 1;
    kick = kick || !got_read;
    fd->read_watcher = NULL;
  }
  if (watcher == fd->write_watcher) {
    /* remove write watcher, kick if we still need a write */
    was_polling = 1;
    kick = kick || !got_write;
    fd->write_watcher = NULL;
  }
  if (!was_polling) {
    /* remove from inactive list */
    watcher->next->prev = watcher->prev;
    watcher->prev->next = watcher->next;
  }
  if (kick) {
    maybe_wake_one_watcher_locked(fd);
  }
  gpr_mu_unlock(&fd->watcher_mu);

  grpc_fd_unref(fd);
}
Ejemplo n.º 2
0
void grpc_fd_end_poll(grpc_exec_ctx *exec_ctx, grpc_fd_watcher *watcher,
                      int got_read, int got_write) {
  int was_polling = 0;
  int kick = 0;
  grpc_fd *fd = watcher->fd;

  if (fd == NULL) {
    return;
  }

  gpr_mu_lock(&fd->mu);

  if (watcher == fd->read_watcher) {
    /* remove read watcher, kick if we still need a read */
    was_polling = 1;
    if (!got_read) {
      kick = 1;
    }
    fd->read_watcher = NULL;
  }
  if (watcher == fd->write_watcher) {
    /* remove write watcher, kick if we still need a write */
    was_polling = 1;
    if (!got_write) {
      kick = 1;
    }
    fd->write_watcher = NULL;
  }
  if (!was_polling && watcher->worker != NULL) {
    /* remove from inactive list */
    watcher->next->prev = watcher->prev;
    watcher->prev->next = watcher->next;
  }
  if (got_read) {
    if (set_ready_locked(exec_ctx, fd, &fd->read_closure)) {
      kick = 1;
    }
  }
  if (got_write) {
    if (set_ready_locked(exec_ctx, fd, &fd->write_closure)) {
      kick = 1;
    }
  }
  if (kick) {
    maybe_wake_one_watcher_locked(fd);
  }
  if (grpc_fd_is_orphaned(fd) && !has_watchers(fd) && !fd->closed) {
    fd->closed = 1;
    if (!fd->released) {
      close(fd->fd);
    }
    grpc_exec_ctx_enqueue(exec_ctx, fd->on_done_closure, 1);
  }
  gpr_mu_unlock(&fd->mu);

  GRPC_FD_UNREF(fd, "poll");
}
Ejemplo n.º 3
0
static void notify_on_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
                             grpc_closure **st, grpc_closure *closure) {
  if (*st == CLOSURE_NOT_READY) {
    /* not ready ==> switch to a waiting state by setting the closure */
    *st = closure;
  } else if (*st == CLOSURE_READY) {
    /* already ready ==> queue the closure to run immediately */
    *st = CLOSURE_NOT_READY;
    grpc_exec_ctx_enqueue(exec_ctx, closure, !fd->shutdown, NULL);
    maybe_wake_one_watcher_locked(fd);
  } else {
    /* upcallptr was set to a different closure.  This is an error! */
    gpr_log(GPR_ERROR,
            "User called a notify_on function with a previous callback still "
            "pending");
    abort();
  }
}
Ejemplo n.º 4
0
void grpc_fd_end_poll(grpc_fd_watcher *watcher, int got_read, int got_write) {
    int was_polling = 0;
    int kick = 0;
    grpc_fd *fd = watcher->fd;

    if (fd == NULL) {
        return;
    }

    gpr_mu_lock(&fd->watcher_mu);
    if (watcher == fd->read_watcher) {
        /* remove read watcher, kick if we still need a read */
        was_polling = 1;
        kick = kick || !got_read;
        fd->read_watcher = NULL;
    }
    if (watcher == fd->write_watcher) {
        /* remove write watcher, kick if we still need a write */
        was_polling = 1;
        kick = kick || !got_write;
        fd->write_watcher = NULL;
    }
    if (!was_polling) {
        /* remove from inactive list */
        watcher->next->prev = watcher->prev;
        watcher->prev->next = watcher->next;
    }
    if (kick) {
        maybe_wake_one_watcher_locked(fd);
    }
    if (grpc_fd_is_orphaned(fd) && !has_watchers(fd) && !fd->closed) {
        fd->closed = 1;
        close(fd->fd);
        if (fd->on_done_closure != NULL) {
            grpc_iomgr_add_callback(fd->on_done_closure);
        }
    }
    gpr_mu_unlock(&fd->watcher_mu);

    GRPC_FD_UNREF(fd, "poll");
}
Ejemplo n.º 5
0
static void maybe_wake_one_watcher(grpc_fd *fd) {
  gpr_mu_lock(&fd->watcher_mu);
  maybe_wake_one_watcher_locked(fd);
  gpr_mu_unlock(&fd->watcher_mu);
}