Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/linux/linux_event.c
Show First 20 Lines • Show All 300 Lines • ▼ Show 20 Lines | epoll_to_kevent(struct thread *td, struct file *epfp, | ||||
struct kevent *kevent, int *nkevents) | struct kevent *kevent, int *nkevents) | ||||
{ | { | ||||
uint32_t levents = l_event->events; | uint32_t levents = l_event->events; | ||||
struct linux_pemuldata *pem; | struct linux_pemuldata *pem; | ||||
struct proc *p; | struct proc *p; | ||||
/* flags related to how event is registered */ | /* flags related to how event is registered */ | ||||
if ((levents & LINUX_EPOLLONESHOT) != 0) | if ((levents & LINUX_EPOLLONESHOT) != 0) | ||||
*kev_flags |= EV_ONESHOT; | *kev_flags |= EV_DISPATCH; | ||||
if ((levents & LINUX_EPOLLET) != 0) | if ((levents & LINUX_EPOLLET) != 0) | ||||
*kev_flags |= EV_CLEAR; | *kev_flags |= EV_CLEAR; | ||||
if ((levents & LINUX_EPOLLERR) != 0) | if ((levents & LINUX_EPOLLERR) != 0) | ||||
*kev_flags |= EV_ERROR; | *kev_flags |= EV_ERROR; | ||||
if ((levents & LINUX_EPOLLRDHUP) != 0) | if ((levents & LINUX_EPOLLRDHUP) != 0) | ||||
*kev_flags |= EV_EOF; | *kev_flags |= EV_EOF; | ||||
/* flags related to what event is registered */ | /* flags related to what event is registered */ | ||||
▲ Show 20 Lines • Show All 178 Lines • ▼ Show 20 Lines | case LINUX_EPOLL_CTL_MOD: | ||||
error = epoll_delete_all_events(td, epfp, args->fd); | error = epoll_delete_all_events(td, epfp, args->fd); | ||||
if (error != 0) | if (error != 0) | ||||
goto leave0; | goto leave0; | ||||
break; | break; | ||||
case LINUX_EPOLL_CTL_ADD: | case LINUX_EPOLL_CTL_ADD: | ||||
/* | /* | ||||
* kqueue_register() return ENOENT if event does not exists | * kqueue_register() return ENOENT if event does not exists | ||||
* and the EV_ADD flag is not set. | * and the EV_ADD flag is not set. Reset EV_ENABLE flag to | ||||
* avoid accidental activation of fired oneshot events. | |||||
*/ | */ | ||||
kev[0].flags &= ~EV_ADD; | kev[0].flags &= ~(EV_ADD | EV_ENABLE); | ||||
error = kqfd_register(args->epfd, &kev[0], td, M_WAITOK); | error = kqfd_register(args->epfd, &kev[0], td, M_WAITOK); | ||||
if (error != ENOENT) { | if (error != ENOENT) { | ||||
error = EEXIST; | error = EEXIST; | ||||
goto leave0; | goto leave0; | ||||
} | } | ||||
error = 0; | error = 0; | ||||
kev[0].flags |= EV_ADD; | kev[0].flags |= (EV_ADD | EV_ENABLE); | ||||
break; | break; | ||||
case LINUX_EPOLL_CTL_DEL: | case LINUX_EPOLL_CTL_DEL: | ||||
/* CTL_DEL means unregister this fd with this epoll */ | /* CTL_DEL means unregister this fd with this epoll */ | ||||
error = epoll_delete_all_events(td, epfp, args->fd); | error = epoll_delete_all_events(td, epfp, args->fd); | ||||
goto leave0; | goto leave0; | ||||
default: | default: | ||||
▲ Show 20 Lines • Show All 807 Lines • Show Last 20 Lines |