Index: usr.sbin/bhyve/mevent.c =================================================================== --- usr.sbin/bhyve/mevent.c +++ usr.sbin/bhyve/mevent.c @@ -62,12 +62,6 @@ #define MEVENT_MAX 64 -#define MEV_ADD 1 -#define MEV_ENABLE 2 -#define MEV_DISABLE 3 -#define MEV_DEL_PENDING 4 -#define MEV_ADD_DISABLED 5 - extern char *vmname; static pthread_t mevent_tid; @@ -83,7 +77,7 @@ enum ev_type me_type; void *me_param; int me_cq; - int me_state; + int me_state; /* Desired kevent flags. */ int me_closefd; LIST_ENTRY(mevent) me_list; }; @@ -153,35 +147,6 @@ return (retval); } -static int -mevent_kq_flags(struct mevent *mevp) -{ - int ret; - - switch (mevp->me_state) { - case MEV_ADD: - ret = EV_ADD; /* implicitly enabled */ - break; - case MEV_ADD_DISABLED: - ret = EV_ADD | EV_DISABLE; - break; - case MEV_ENABLE: - ret = EV_ENABLE; - break; - case MEV_DISABLE: - ret = EV_DISABLE; - break; - case MEV_DEL_PENDING: - ret = EV_DELETE; - break; - default: - assert(0); - break; - } - - return (ret); -} - static int mevent_kq_fflags(struct mevent *mevp) { @@ -215,7 +180,7 @@ kev[i].data = 0; } kev[i].filter = mevent_kq_filter(mevp); - kev[i].flags = mevent_kq_flags(mevp); + kev[i].flags = mevp->me_state; kev[i].fflags = mevent_kq_fflags(mevp); kev[i].udata = mevp; i++; @@ -224,9 +189,11 @@ mevp->me_cq = 0; LIST_REMOVE(mevp, me_list); - if (mevp->me_state == MEV_DEL_PENDING) { + if (mevp->me_state & EV_DELETE) { free(mevp); } else { + if (mevp->me_state & EV_ADD) + mevp->me_state &= ~EV_ADD; /* Add only once. */ LIST_INSERT_HEAD(&global_head, mevp, me_list); } @@ -318,7 +285,7 @@ void (*func)(int, enum ev_type, void *), void *param) { - return mevent_add_state(tfd, type, func, param, MEV_ADD); + return mevent_add_state(tfd, type, func, param, EV_ADD); } struct mevent * @@ -326,18 +293,32 @@ void (*func)(int, enum ev_type, void *), void *param) { - return mevent_add_state(tfd, type, func, param, MEV_ADD_DISABLED); + return mevent_add_state(tfd, type, func, param, EV_ADD | EV_DISABLE); } static int -mevent_update(struct mevent *evp, int newstate) +mevent_update(struct mevent *evp, int command) { + int newstate; + /* * It's not possible to enable/disable a deleted event */ - if (evp->me_state == MEV_DEL_PENDING) + if (evp->me_state & EV_DELETE) return (EINVAL); + newstate = evp->me_state | command; + switch (command) { + case EV_ENABLE: + newstate &= ~EV_DISABLE; + break; + case EV_DISABLE: + newstate &= ~EV_ENABLE; + break; + default: + assert(0); + } + /* * No update needed if state isn't changing */ @@ -367,14 +348,14 @@ mevent_enable(struct mevent *evp) { - return (mevent_update(evp, MEV_ENABLE)); + return (mevent_update(evp, EV_ENABLE)); } int mevent_disable(struct mevent *evp) { - return (mevent_update(evp, MEV_DISABLE)); + return (mevent_update(evp, EV_DISABLE)); } static int @@ -392,7 +373,7 @@ LIST_INSERT_HEAD(&change_head, evp, me_list); mevent_notify(); } - evp->me_state = MEV_DEL_PENDING; + evp->me_state = EV_DELETE; if (closefd) evp->me_closefd = 1;