- upoll = e.data.ptr;
- if ((e.events & EPOLLIN) && upoll->read)
- upoll->read(upoll->closure);
- if ((e.events & EPOLLOUT) && upoll->write)
- upoll->write(upoll->closure);
- if ((e.events & EPOLLHUP) && upoll->hangup)
- upoll->hangup(upoll->closure);
+ ufd = e.data.ptr;
+ current = ufd->head;
+ e.events &= EPOLLIN | EPOLLOUT | EPOLLHUP;
+ while (current != NULL && e.events != 0) {
+ if ((e.events & EPOLLIN) && current->read) {
+ current->read(current->closure);
+ e.events &= (uint32_t)~EPOLLIN;
+ continue;
+ }
+ if ((e.events & EPOLLOUT) && current->write) {
+ current->write(current->closure);
+ e.events &= (uint32_t)~EPOLLOUT;
+ continue;
+ }
+ if ((e.events & EPOLLHUP) && current->hangup) {
+ current->hangup(current->closure);
+ if (current == NULL)
+ break;
+ }
+ current = current->next;
+ }