|
|
|
@ -932,24 +932,12 @@ static int fd_wrapped_fd(grpc_fd *fd) { |
|
|
|
|
static void fd_orphan(grpc_exec_ctx *exec_ctx, grpc_fd *fd, |
|
|
|
|
grpc_closure *on_done, int *release_fd, |
|
|
|
|
const char *reason) { |
|
|
|
|
bool is_fd_closed = false; |
|
|
|
|
grpc_error *error = GRPC_ERROR_NONE; |
|
|
|
|
polling_island *unref_pi = NULL; |
|
|
|
|
|
|
|
|
|
gpr_mu_lock(&fd->po.mu); |
|
|
|
|
fd->on_done_closure = on_done; |
|
|
|
|
|
|
|
|
|
/* If release_fd is not NULL, we should be relinquishing control of the file
|
|
|
|
|
descriptor fd->fd (but we still own the grpc_fd structure). */ |
|
|
|
|
if (release_fd != NULL) { |
|
|
|
|
*release_fd = fd->fd; |
|
|
|
|
} else { |
|
|
|
|
close(fd->fd); |
|
|
|
|
is_fd_closed = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fd->orphaned = true; |
|
|
|
|
|
|
|
|
|
/* Remove the active status but keep referenced. We want this grpc_fd struct
|
|
|
|
|
to be alive (and not added to freelist) until the end of this function */ |
|
|
|
|
REF_BY(fd, 1, reason); |
|
|
|
@ -964,13 +952,24 @@ static void fd_orphan(grpc_exec_ctx *exec_ctx, grpc_fd *fd, |
|
|
|
|
before doing this.) */ |
|
|
|
|
if (fd->po.pi != NULL) { |
|
|
|
|
polling_island *pi_latest = polling_island_lock(fd->po.pi); |
|
|
|
|
polling_island_remove_fd_locked(pi_latest, fd, is_fd_closed, &error); |
|
|
|
|
polling_island_remove_fd_locked(pi_latest, fd, false /* is_fd_closed */, |
|
|
|
|
&error); |
|
|
|
|
gpr_mu_unlock(&pi_latest->mu); |
|
|
|
|
|
|
|
|
|
unref_pi = fd->po.pi; |
|
|
|
|
fd->po.pi = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* If release_fd is not NULL, we should be relinquishing control of the file
|
|
|
|
|
descriptor fd->fd (but we still own the grpc_fd structure). */ |
|
|
|
|
if (release_fd != NULL) { |
|
|
|
|
*release_fd = fd->fd; |
|
|
|
|
} else { |
|
|
|
|
close(fd->fd); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fd->orphaned = true; |
|
|
|
|
|
|
|
|
|
GRPC_CLOSURE_SCHED(exec_ctx, fd->on_done_closure, GRPC_ERROR_REF(error)); |
|
|
|
|
|
|
|
|
|
gpr_mu_unlock(&fd->po.mu); |
|
|
|
|