+ if (ufd->events == events)
+ rc = 0;
+ else {
+ e.events = events;
+ e.data.ptr = ufd;
+ rc = epoll_ctl(pollfd, EPOLL_CTL_MOD, ufd->fd, &e);
+ if (rc == 0)
+ ufd->events = events;
+ }
+ pthread_mutex_unlock(&mutex);
+ return rc;
+}
+
+/*
+ * Compute the events for the set of clients
+ */
+static int update_flags(struct upollfd *ufd)
+{
+ pthread_mutex_lock(&mutex);
+ return update_flags_locked(ufd);
+}
+
+/*
+ *
+ */
+static int update(struct upollfd *ufd)
+{
+ struct upollfd **prv;
+
+ pthread_mutex_lock(&mutex);
+ if (ufd->head != NULL)
+ return update_flags_locked(ufd);
+
+ /* no more watchers */
+ prv = &head;
+ while(*prv) {
+ if (*prv == ufd) {
+ *prv = ufd->next;
+ break;
+ }
+ prv = &(*prv)->next;
+ }
+ pthread_mutex_unlock(&mutex);
+ epoll_ctl(pollfd, EPOLL_CTL_DEL, ufd->fd, NULL);
+ free(ufd);