diff options
author | 2015-02-18 15:10:53 -0800 | |
---|---|---|
committer | 2015-02-18 15:10:53 -0800 | |
commit | 0fcd53c701a207d236f48a922e7f596999d3ecd7 (patch) | |
tree | 7df03b91c6c36f2ef5440f45747b4beb83f46471 /src/core/iomgr/tcp_server_posix.c | |
parent | 9be83eec1de2932946d61b774788ca18fb41e2fe (diff) |
Fix a TSAN reported error
We now pass down pointers to closures instead of (callback, arg) pair
elements separately. This allows us to store one word atomically, fixing
a race condition.
All call sites have been updated to the new API. No new allocations are
incurred. grpc_fd_state is deleted to avoid any temptation to ever add
anything there again.
Diffstat (limited to 'src/core/iomgr/tcp_server_posix.c')
-rw-r--r-- | src/core/iomgr/tcp_server_posix.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/core/iomgr/tcp_server_posix.c b/src/core/iomgr/tcp_server_posix.c index b7a0625949..90b7eb451d 100644 --- a/src/core/iomgr/tcp_server_posix.c +++ b/src/core/iomgr/tcp_server_posix.c @@ -82,6 +82,7 @@ typedef struct { struct sockaddr_un un; } addr; int addr_len; + grpc_iomgr_closure read_closure; } server_port; static void unlink_if_unix_domain_socket(const struct sockaddr_un *un) { @@ -244,7 +245,7 @@ static void on_read(void *arg, int success) { case EINTR: continue; case EAGAIN: - grpc_fd_notify_on_read(sp->emfd, on_read, sp); + grpc_fd_notify_on_read(sp->emfd, &sp->read_closure); return; default: gpr_log(GPR_ERROR, "Failed accept4: %s", strerror(errno)); @@ -393,7 +394,9 @@ void grpc_tcp_server_start(grpc_tcp_server *s, grpc_pollset **pollsets, for (j = 0; j < pollset_count; j++) { grpc_pollset_add_fd(pollsets[j], s->ports[i].emfd); } - grpc_fd_notify_on_read(s->ports[i].emfd, on_read, &s->ports[i]); + s->ports[i].read_closure.cb = on_read; + s->ports[i].read_closure.cb_arg = &s->ports[i]; + grpc_fd_notify_on_read(s->ports[i].emfd, &s->ports[i].read_closure); s->active_ports++; } gpr_mu_unlock(&s->mu); |