/* * comm_setselect * * This is a needed exported function which will be called to register * and deregister interest in a pending IO state for a given FD. */ void comm_setselect(fde_t *F, unsigned int type, void (*handler)(fde_t *, void *), void *client_data, time_t timeout) { int new_events; if ((type & COMM_SELECT_READ)) { F->read_handler = handler; F->read_data = client_data; } if ((type & COMM_SELECT_WRITE)) { F->write_handler = handler; F->write_data = client_data; } new_events = (F->read_handler ? POLLIN : 0) | (F->write_handler ? POLLOUT : 0); if (timeout != 0) { F->timeout = CurrentTime + (timeout / 1000); F->timeout_handler = handler; F->timeout_data = client_data; } if (new_events != F->evcache) { devpoll_write_update(F->fd, POLLREMOVE); if ((F->evcache = new_events)) devpoll_write_update(F->fd, new_events); } }
void devpoll_update_events(int fd, short filter, PF * handler) { int update_required = 0; int cur_mask = fdmask[fd]; PF *cur_handler; fdmask[fd] = 0; switch (filter) { case COMM_SELECT_READ: cur_handler = fd_table[fd].read_handler; if(handler) fdmask[fd] |= POLLRDNORM; else fdmask[fd] &= ~POLLRDNORM; if(fd_table[fd].write_handler) fdmask[fd] |= POLLWRNORM; break; case COMM_SELECT_WRITE: cur_handler = fd_table[fd].write_handler; if(handler) fdmask[fd] |= POLLWRNORM; else fdmask[fd] &= ~POLLWRNORM; if(fd_table[fd].read_handler) fdmask[fd] |= POLLRDNORM; break; default: #ifdef NOTYET ilog(L_NOTICE, "devpoll_update_events called with unknown filter: %hd\n", filter); #endif return; break; } if(cur_handler == NULL && handler != NULL) update_required++; else if(cur_handler != NULL && handler == NULL) update_required++; if(cur_mask != fdmask[fd]) update_required++; if(update_required) { /* * Ok, we can call devpoll_write_update() here now to re-build the * fd struct. If we end up with nothing on this fd, it won't write * anything. */ if(fdmask[fd]) { devpoll_write_update(fd, POLLREMOVE); devpoll_write_update(fd, fdmask[fd]); } else devpoll_write_update(fd, POLLREMOVE); } }
static void devpoll_update_events(rb_fde_t *F, short filter, PF * handler) { int update_required = 0; int fd = rb_get_fd(F); int cur_mask = fdmask[fd]; PF *cur_handler; fdmask[fd] = 0; switch (filter) { case RB_SELECT_READ: cur_handler = F->read_handler; if(handler) fdmask[fd] |= POLLRDNORM; else fdmask[fd] &= ~POLLRDNORM; if(F->write_handler) fdmask[fd] |= POLLWRNORM; break; case RB_SELECT_WRITE: cur_handler = F->write_handler; if(handler) fdmask[fd] |= POLLWRNORM; else fdmask[fd] &= ~POLLWRNORM; if(F->read_handler) fdmask[fd] |= POLLRDNORM; break; default: return; break; } if(cur_handler == NULL && handler != NULL) update_required++; else if(cur_handler != NULL && handler == NULL) update_required++; if(cur_mask != fdmask[fd]) update_required++; if(update_required) { /* * Ok, we can call devpoll_write_update() here now to re-build the * fd struct. If we end up with nothing on this fd, it won't write * anything. */ if(fdmask[fd]) { devpoll_write_update(fd, POLLREMOVE); devpoll_write_update(fd, fdmask[fd]); } else devpoll_write_update(fd, POLLREMOVE); } }
/* * comm_setselect * * This is a needed exported function which will be called to register * and deregister interest in a pending IO state for a given FD. */ void comm_setselect(fde_t *F, unsigned int type, void (*handler)(fde_t *, void *), void *client_data, uintmax_t timeout) { int new_events; assert(F); assert(F->flags.open == true); if ((type & COMM_SELECT_READ)) { F->read_handler = handler; F->read_data = client_data; } if ((type & COMM_SELECT_WRITE)) { F->write_handler = handler; F->write_data = client_data; } new_events = (F->read_handler ? POLLIN : 0) | (F->write_handler ? POLLOUT : 0); if (timeout) { F->timeout = event_base->time.sec_monotonic + timeout; F->timeout_handler = handler; F->timeout_data = client_data; } if (new_events != F->evcache) { devpoll_write_update(F->fd, POLLREMOVE); if ((F->evcache = new_events)) devpoll_write_update(F->fd, new_events); } }