void engine_change_fd_state(int fd, unsigned int stateplus) { int prevstate = (int) get_fd_internal(fd); if((stateplus & FDF_WANTREAD) && !(prevstate & FDF_WANTREAD)) { FD_SET(fd, &g_read_set); prevstate |= FDF_WANTREAD; } else if(!(stateplus & FDF_WANTREAD) && (prevstate & FDF_WANTREAD)) { FD_CLR(fd, &g_read_set); prevstate &= ~(FDF_WANTREAD); } if((stateplus & FDF_WANTWRITE) && !(prevstate & FDF_WANTWRITE)) { FD_SET(fd, &g_write_set); prevstate |= FDF_WANTWRITE; } else if(!(stateplus & FDF_WANTWRITE) && (prevstate & FDF_WANTWRITE)) { FD_CLR(fd, &g_write_set); prevstate &= ~(FDF_WANTWRITE); } set_fd_internal(fd, (void *) prevstate); }
void engine_add_fd(long fd) { struct pollfd *pfd = &poll_fds[++last_pfd]; /* sanity check */ if(last_pfd >= MAXCONNECTIONS) abort(); set_fd_internal(fd, (void *) last_pfd); pfd->fd = fd; pfd->events = 0; pfd->revents = 0; }
void engine_add_fd(int fd) { struct pollfd dev_fd; if (numfds >= MAXCONNECTIONS) abort(); dev_fd.events = 0; dev_fd.revents = 0; dev_fd.fd = fd; if (write(devpoll_id, &dev_fd, sizeof(struct pollfd)) != sizeof(struct pollfd)) abort(); set_fd_internal(fd, 0); ++numfds; }
void engine_change_fd_state(int fd, unsigned int stateplus) { unsigned int events = 0; struct pollfd dev_fd; if (stateplus & FDF_WANTWRITE) events |= POLLOUT; if (stateplus & FDF_WANTREAD) events |= POLLIN|POLLHUP|POLLERR; dev_fd.events = events; dev_fd.revents = 0; dev_fd.fd = fd; if (write(devpoll_id, &dev_fd, sizeof(struct pollfd)) != sizeof(struct pollfd)) abort(); set_fd_internal(fd, (void*)events); }
void engine_del_fd(long fd) { long arrayidx = (long) get_fd_internal(fd); /* If it's at the end of the array, just chop it off */ if(arrayidx == last_pfd) { fdfprintf(stderr, "Removing %d[%d] from end of pollfds\n", last_pfd, fd); last_pfd--; return; } /* Otherwise, move the last array member to where the old one was */ fdfprintf(stderr, "Moving pfd %d[%d] to vacated spot %d[%d] -- now %d[%d]\n", last_pfd, poll_fds[last_pfd].fd, arrayidx, fd, last_pfd, fd); memcpy(&poll_fds[arrayidx], &poll_fds[last_pfd], sizeof(struct pollfd)); last_pfd--; set_fd_internal(poll_fds[arrayidx].fd, (void *) arrayidx); }
void engine_add_fd(int fd) { set_fd_internal(fd, (void *) 0); }