aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/lib
diff options
context:
space:
mode:
authorGravatar Ken Payson <kpayson@google.com>2016-10-13 15:06:01 -0700
committerGravatar Ken Payson <kpayson@google.com>2016-10-13 15:06:01 -0700
commitb97cbd7acc3107f8cbd5fcf2d07ad48e1431513b (patch)
treece4155d40882db04414d009ee4d66ca3c81d1945 /src/core/lib
parent82e4ec741ba3e564d1223f0f20355a6e27e70136 (diff)
Use atomics for poll status to prevent tsan race complaints
Diffstat (limited to 'src/core/lib')
-rw-r--r--src/core/lib/iomgr/ev_poll_posix.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/src/core/lib/iomgr/ev_poll_posix.c b/src/core/lib/iomgr/ev_poll_posix.c
index d9e5255ddc..f137e4dacc 100644
--- a/src/core/lib/iomgr/ev_poll_posix.c
+++ b/src/core/lib/iomgr/ev_poll_posix.c
@@ -254,7 +254,7 @@ struct grpc_pollset_set {
#define CV_POLL_PERIOD_MS 1000
#define CV_DEFAULT_TABLE_SIZE 16
-typedef enum status_t { INPROGRESS, COMPLETED, CANCELLED } status_t;
+typedef enum poll_status_t { INPROGRESS, COMPLETED, CANCELLED } poll_status_t;
typedef struct poll_args {
gpr_refcount refcount;
@@ -264,7 +264,7 @@ typedef struct poll_args {
int timeout;
int retval;
int err;
- status_t status;
+ gpr_atm status;
} poll_args;
cv_fd_table g_cvfds;
@@ -1276,7 +1276,7 @@ static void decref_poll_args(poll_args *args) {
static void run_poll(void *arg) {
int timeout, retval;
poll_args *pargs = (poll_args *)arg;
- while (pargs->status == INPROGRESS) {
+ while (gpr_atm_no_barrier_load(&pargs->status) == INPROGRESS) {
if (pargs->timeout < 0) {
timeout = CV_POLL_PERIOD_MS;
} else {
@@ -1291,9 +1291,9 @@ static void run_poll(void *arg) {
}
}
gpr_mu_lock(&g_cvfds.mu);
- if (pargs->status == INPROGRESS) {
+ if (gpr_atm_no_barrier_load(&pargs->status) == INPROGRESS) {
// Signal main thread that the poll completed
- pargs->status = COMPLETED;
+ gpr_atm_no_barrier_store(&pargs->status, COMPLETED);
gpr_cv_signal(pargs->cv);
}
decref_poll_args(pargs);
@@ -1345,7 +1345,7 @@ static int cvfd_poll(struct pollfd *fds, nfds_t nfds, int timeout) {
pargs->timeout = timeout;
pargs->retval = 0;
pargs->err = 0;
- pargs->status = INPROGRESS;
+ gpr_atm_no_barrier_store(&pargs->status, INPROGRESS);
idx = 0;
for (i = 0; i < nfds; i++) {
if (fds[i].fd >= 0) {
@@ -1361,13 +1361,13 @@ static int cvfd_poll(struct pollfd *fds, nfds_t nfds, int timeout) {
gpr_thd_new(&t_id, &run_poll, pargs, &opt);
// We want the poll() thread to trigger the deadline, so wait forever here
gpr_cv_wait(pollcv, &g_cvfds.mu, gpr_inf_future(GPR_CLOCK_MONOTONIC));
- if (pargs->status == COMPLETED) {
+ if (gpr_atm_no_barrier_load(&pargs->status) == COMPLETED) {
res = pargs->retval;
errno = pargs->err;
} else {
res = 0;
errno = 0;
- pargs->status = CANCELLED;
+ gpr_atm_no_barrier_store(&pargs->status, CANCELLED);
}
} else {
gpr_timespec deadline = gpr_now(GPR_CLOCK_REALTIME);
@@ -1398,7 +1398,8 @@ static int cvfd_poll(struct pollfd *fds, nfds_t nfds, int timeout) {
fds[i].revents = POLLIN;
if (res >= 0) res++;
}
- } else if (fds[i].fd >= 0 && pargs->status == COMPLETED) {
+ } else if (fds[i].fd >= 0 &&
+ gpr_atm_no_barrier_load(&pargs->status) == COMPLETED) {
fds[i].revents = pargs->fds[idx].revents;
idx++;
}