|
|
|
@ -942,15 +942,19 @@ static grpc_pollset *fd_get_read_notifier_pollset(grpc_exec_ctx *exec_ctx, |
|
|
|
|
return notifier; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Might be called multiple times */ |
|
|
|
|
static void fd_shutdown(grpc_exec_ctx *exec_ctx, grpc_fd *fd) { |
|
|
|
|
gpr_mu_lock(&fd->mu); |
|
|
|
|
GPR_ASSERT(!fd->shutdown); |
|
|
|
|
fd->shutdown = true; |
|
|
|
|
|
|
|
|
|
/* Flush any pending read and write closures. Since fd->shutdown is 'true' at
|
|
|
|
|
this point, the closures would be called with 'success = false' */ |
|
|
|
|
set_ready_locked(exec_ctx, fd, &fd->read_closure); |
|
|
|
|
set_ready_locked(exec_ctx, fd, &fd->write_closure); |
|
|
|
|
/* Do the actual shutdown only once */ |
|
|
|
|
if (!fd->shutdown) { |
|
|
|
|
fd->shutdown = true; |
|
|
|
|
|
|
|
|
|
shutdown(fd->fd, SHUT_RDWR); |
|
|
|
|
/* Flush any pending read and write closures. Since fd->shutdown is 'true'
|
|
|
|
|
at this point, the closures would be called with 'success = false' */ |
|
|
|
|
set_ready_locked(exec_ctx, fd, &fd->read_closure); |
|
|
|
|
set_ready_locked(exec_ctx, fd, &fd->write_closure); |
|
|
|
|
} |
|
|
|
|
gpr_mu_unlock(&fd->mu); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|