int fd;
int rwx; /* 4=except 2=write 1=read */
uxsel_callback_fn callback;
+ int id; /* for uxsel_input_remove */
};
static tree234 *fds;
oldfd = find234(fds, newfd, NULL);
if (oldfd) {
+ uxsel_input_remove(oldfd->id);
del234(fds, oldfd);
sfree(oldfd);
}
add234(fds, newfd);
+ newfd->id = uxsel_input_add(fd, rwx);
}
void uxsel_del(int fd)
{
struct fd *oldfd = find234(fds, &fd, uxsel_fd_findcmp);
if (oldfd) {
+ uxsel_input_remove(oldfd->id);
del234(fds, oldfd);
sfree(oldfd);
}
int select_result(int fd, int event)
{
struct fd *fdstruct = find234(fds, &fd, uxsel_fd_findcmp);
- assert(fdstruct != NULL);
- return fdstruct->callback(fd, event);
+ /*
+ * Apparently this can sometimes be NULL. Can't see how, but I
+ * assume it means I need to ignore the event since it's on an
+ * fd I've stopped being interested in. Sigh.
+ */
+ if (fdstruct)
+ return fdstruct->callback(fd, event);
+ else
+ return 1;
}