aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar David Klempner <klempner@google.com>2015-02-17 15:52:16 -0800
committerGravatar David Klempner <klempner@google.com>2015-02-17 15:52:16 -0800
commit7cffec1e01622e031c4c8ca773c57b1eca1b34f8 (patch)
tree2a57f0de579e0faa02d9011d327367ff41bee9f3
parent30313622ac6c4be7dec19324e6952e4e4d3e56eb (diff)
parentfc3aca2ea8602e9cfbd52a7c10b64b34c7aeac86 (diff)
Merge pull request #556 from ctiller/codesize
Fix refcounting bug leading to objects not being cleaned up
-rw-r--r--src/core/iomgr/fd_posix.c7
-rw-r--r--src/core/iomgr/pollset_posix.c1
2 files changed, 6 insertions, 2 deletions
diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c
index 737ee016aa..cc57830551 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 53c9806fb9..1245d22dde 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);
}
}