- struct epoll_event e;
- e.events = (uint32_t)((upoll->read != NULL ? EPOLLIN : 0 )
- | (upoll->write != NULL ? EPOLLOUT : 0));
- e.data.ptr = upoll;
- return epoll_ctl(pollfd, EPOLL_CTL_MOD, upoll->fd, &e);
+ struct upollfd *itfd = head;
+ struct upoll *it;
+ while (itfd != NULL) {
+ it = itfd->head;
+ while (it != NULL) {
+ if (it == upoll)
+ return 1;
+ it = it->next;
+ }
+ itfd = itfd->next;
+ }
+ return 0;
+}
+
+struct upoll *upoll_open(int fd, void *closure)
+{
+ struct upollfd *ufd;
+ struct upoll *result;
+
+ /* allocates */
+ result = calloc(1, sizeof *result);
+ if (result == NULL)
+ return NULL;
+
+ /* get for fd */
+ ufd = get_fd(fd);
+ if (ufd == NULL) {
+ free(result);
+ return NULL;
+ }
+
+ /* init */
+ result->fd = ufd;
+ result->closure = closure;
+ pthread_mutex_lock(&mutex);
+ result->next = ufd->head;
+ ufd->head = result;
+ pthread_mutex_unlock(&mutex);
+ return result;