diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c index 737ee016aab..cc578305513 100644 --- a/src/core/iomgr/fd_posix.c +++ b/src/core/iomgr/fd_posix.c @@ -104,14 +104,17 @@ static void destroy(grpc_fd *fd) { } static void ref_by(grpc_fd *fd, int n) { - gpr_atm_no_barrier_fetch_add(&fd->refst, n); + GPR_ASSERT(gpr_atm_no_barrier_fetch_add(&fd->refst, n) > 0); } static void unref_by(grpc_fd *fd, int n) { - if (gpr_atm_full_fetch_add(&fd->refst, -n) == n) { + gpr_atm old = gpr_atm_full_fetch_add(&fd->refst, -n); + if (old == n) { grpc_iomgr_add_callback(fd->on_done, fd->on_done_user_data); freelist_fd(fd); grpc_iomgr_unref(); + } else { + GPR_ASSERT(old > n); } } diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c index 53c9806fb9b..1245d22ddee 100644 --- a/src/core/iomgr/pollset_posix.c +++ b/src/core/iomgr/pollset_posix.c @@ -214,6 +214,7 @@ static void unary_poll_pollset_add_fd(grpc_pollset *pollset, grpc_fd *fd) { * unary poller */ grpc_fd_unref(fds[0]); pollset->data.ptr = fd; + grpc_fd_ref(fd); } }