|  | @@ -134,7 +134,9 @@ static void unref_by(grpc_fd *fd, int n) {
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |    old = gpr_atm_full_fetch_add(&fd->refst, -n);
 | 
	
		
			
				|  |  |    if (old == n) {
 | 
	
		
			
				|  |  | -    grpc_iomgr_add_callback(&fd->on_done_closure);
 | 
	
		
			
				|  |  | +    if (fd->on_done_closure) {
 | 
	
		
			
				|  |  | +      grpc_iomgr_add_callback(fd->on_done_closure);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      freelist_fd(fd);
 | 
	
		
			
				|  |  |      grpc_iomgr_unregister_object(&fd->iomgr_object);
 | 
	
		
			
				|  |  |    } else {
 | 
	
	
		
			
				|  | @@ -153,8 +155,6 @@ void grpc_fd_global_shutdown(void) {
 | 
	
		
			
				|  |  |    gpr_mu_destroy(&fd_freelist_mu);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static void do_nothing(void *ignored, int success) {}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  grpc_fd *grpc_fd_create(int fd, const char *name) {
 | 
	
		
			
				|  |  |    grpc_fd *r = alloc_fd(fd);
 | 
	
		
			
				|  |  |    grpc_iomgr_register_object(&r->iomgr_object, name);
 | 
	
	
		
			
				|  | @@ -195,9 +195,8 @@ static void wake_all_watchers_locked(grpc_fd *fd) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void grpc_fd_orphan(grpc_fd *fd, grpc_iomgr_cb_func on_done, void *user_data) {
 | 
	
		
			
				|  |  | -  grpc_iomgr_closure_init(&fd->on_done_closure, on_done ? on_done : do_nothing,
 | 
	
		
			
				|  |  | -                          user_data);
 | 
	
		
			
				|  |  | +void grpc_fd_orphan(grpc_fd *fd, grpc_iomgr_closure *on_done) {
 | 
	
		
			
				|  |  | +  fd->on_done_closure = on_done;
 | 
	
		
			
				|  |  |    shutdown(fd->fd, SHUT_RDWR);
 | 
	
		
			
				|  |  |    REF_BY(fd, 1, "orphan"); /* remove active status, but keep referenced */
 | 
	
		
			
				|  |  |    gpr_mu_lock(&fd->watcher_mu);
 | 
	
	
		
			
				|  | @@ -208,21 +207,18 @@ void grpc_fd_orphan(grpc_fd *fd, grpc_iomgr_cb_func on_done, void *user_data) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* increment refcount by two to avoid changing the orphan bit */
 | 
	
		
			
				|  |  |  #ifdef GRPC_FD_REF_COUNT_DEBUG
 | 
	
		
			
				|  |  | -void grpc_fd_ref(grpc_fd *fd, const char *reason, const char *file, int line) { 
 | 
	
		
			
				|  |  | -  ref_by(fd, 2, reason, file, line); 
 | 
	
		
			
				|  |  | +void grpc_fd_ref(grpc_fd *fd, const char *reason, const char *file, int line) {
 | 
	
		
			
				|  |  | +  ref_by(fd, 2, reason, file, line);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void grpc_fd_unref(grpc_fd *fd, const char *reason, const char *file, int line) { 
 | 
	
		
			
				|  |  | -  unref_by(fd, 2, reason, file, line); 
 | 
	
		
			
				|  |  | +void grpc_fd_unref(grpc_fd *fd, const char *reason, const char *file,
 | 
	
		
			
				|  |  | +                   int line) {
 | 
	
		
			
				|  |  | +  unref_by(fd, 2, reason, file, line);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  #else
 | 
	
		
			
				|  |  | -void grpc_fd_ref(grpc_fd *fd) { 
 | 
	
		
			
				|  |  | -  ref_by(fd, 2); 
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +void grpc_fd_ref(grpc_fd *fd) { ref_by(fd, 2); }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void grpc_fd_unref(grpc_fd *fd) { 
 | 
	
		
			
				|  |  | -  unref_by(fd, 2); 
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +void grpc_fd_unref(grpc_fd *fd) { unref_by(fd, 2); }
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void process_callback(grpc_iomgr_closure *closure, int success,
 |