def register(self, fd, eventmask=EPOLLIN | EPOLLPRI | EPOLLOUT, retval=None): "retval is extension to stdlib, value to use in results from .poll()." if retval is None: retval = fd s = struct.pack(epoll_event, eventmask, retval) r = epoll_ctl(self.epfd, EPOLL_CTL_ADD, fd, s) if r == -1 and os.errno_() == errno.EEXIST: r = epoll_ctl(self.epfd, EPOLL_CTL_MOD, fd, s) os.check_error(r) # We must keep reference to retval, or it may be GCed. And we must # keep mapping from fd to retval to be able to get rid of this retval # reference later. self.registry[fd] = retval