|  | @@ -192,12 +192,6 @@ static grpc_fd *fd_create(int fd, const char *name) {
 | 
	
		
			
				|  |  |      new_fd = gpr_malloc(sizeof(grpc_fd));
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  struct epoll_event ev = {.events = (uint32_t)(EPOLLIN | EPOLLOUT | EPOLLET),
 | 
	
		
			
				|  |  | -                           .data.ptr = new_fd};
 | 
	
		
			
				|  |  | -  if (epoll_ctl(g_epfd, EPOLL_CTL_ADD, fd, &ev) != 0) {
 | 
	
		
			
				|  |  | -    gpr_log(GPR_ERROR, "epoll_ctl failed: %s", strerror(errno));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    new_fd->fd = fd;
 | 
	
		
			
				|  |  |    grpc_lfev_init(&new_fd->read_closure);
 | 
	
		
			
				|  |  |    grpc_lfev_init(&new_fd->write_closure);
 | 
	
	
		
			
				|  | @@ -212,16 +206,37 @@ static grpc_fd *fd_create(int fd, const char *name) {
 | 
	
		
			
				|  |  |    gpr_log(GPR_DEBUG, "FD %d %p create %s", fd, (void *)new_fd, fd_name);
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |    gpr_free(fd_name);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  struct epoll_event ev = {.events = (uint32_t)(EPOLLIN | EPOLLOUT | EPOLLET),
 | 
	
		
			
				|  |  | +                           .data.ptr = new_fd};
 | 
	
		
			
				|  |  | +  if (epoll_ctl(g_epfd, EPOLL_CTL_ADD, fd, &ev) != 0) {
 | 
	
		
			
				|  |  | +    gpr_log(GPR_ERROR, "epoll_ctl failed: %s", strerror(errno));
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    return new_fd;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static int fd_wrapped_fd(grpc_fd *fd) { return fd->fd; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +/* Might be called multiple times */
 | 
	
		
			
				|  |  | +static void fd_shutdown(grpc_exec_ctx *exec_ctx, grpc_fd *fd, grpc_error *why) {
 | 
	
		
			
				|  |  | +  if (grpc_lfev_set_shutdown(exec_ctx, &fd->read_closure,
 | 
	
		
			
				|  |  | +                             GRPC_ERROR_REF(why))) {
 | 
	
		
			
				|  |  | +    shutdown(fd->fd, SHUT_RDWR);
 | 
	
		
			
				|  |  | +    grpc_lfev_set_shutdown(exec_ctx, &fd->write_closure, GRPC_ERROR_REF(why));
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  GRPC_ERROR_UNREF(why);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static void fd_orphan(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
 | 
	
		
			
				|  |  |                        grpc_closure *on_done, int *release_fd,
 | 
	
		
			
				|  |  |                        const char *reason) {
 | 
	
		
			
				|  |  |    grpc_error *error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  if (!grpc_lfev_is_shutdown(&fd->read_closure)) {
 | 
	
		
			
				|  |  | +    fd_shutdown(exec_ctx, fd, GRPC_ERROR_CREATE_FROM_COPIED_STRING(reason));
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    /* 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) {
 | 
	
	
		
			
				|  | @@ -252,16 +267,6 @@ static bool fd_is_shutdown(grpc_fd *fd) {
 | 
	
		
			
				|  |  |    return grpc_lfev_is_shutdown(&fd->read_closure);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -/* Might be called multiple times */
 | 
	
		
			
				|  |  | -static void fd_shutdown(grpc_exec_ctx *exec_ctx, grpc_fd *fd, grpc_error *why) {
 | 
	
		
			
				|  |  | -  if (grpc_lfev_set_shutdown(exec_ctx, &fd->read_closure,
 | 
	
		
			
				|  |  | -                             GRPC_ERROR_REF(why))) {
 | 
	
		
			
				|  |  | -    shutdown(fd->fd, SHUT_RDWR);
 | 
	
		
			
				|  |  | -    grpc_lfev_set_shutdown(exec_ctx, &fd->write_closure, GRPC_ERROR_REF(why));
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  GRPC_ERROR_UNREF(why);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  static void fd_notify_on_read(grpc_exec_ctx *exec_ctx, grpc_fd *fd,
 | 
	
		
			
				|  |  |                                grpc_closure *closure) {
 | 
	
		
			
				|  |  |    grpc_lfev_notify_on(exec_ctx, &fd->read_closure, closure);
 | 
	
	
		
			
				|  | @@ -703,6 +708,8 @@ const grpc_event_engine_vtable *grpc_init_epoll1_linux(bool explicit_request) {
 | 
	
		
			
				|  |  |  #include "src/core/lib/iomgr/ev_posix.h"
 | 
	
		
			
				|  |  |  /* If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return
 | 
	
		
			
				|  |  |   * NULL */
 | 
	
		
			
				|  |  | -const grpc_event_engine_vtable *grpc_init_epoll1_linux(bool explicit_request) { return NULL; }
 | 
	
		
			
				|  |  | +const grpc_event_engine_vtable *grpc_init_epoll1_linux(bool explicit_request) {
 | 
	
		
			
				|  |  | +  return NULL;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  #endif /* defined(GRPC_POSIX_SOCKET) */
 | 
	
		
			
				|  |  |  #endif /* !defined(GRPC_LINUX_EPOLL) */
 |