Re-adding an event to a kqueue modifies the parameters of the original event.
However, if the original knote had been disabled then it is not automatically re-enabled. Fix this by using EV_ADD to create an mevent and EV_ENABLE to enable it. Adding a kevent for the first time implicitly enables it so existing callers of mevent_add() don't need to change. Reviewed by: grehan
This commit is contained in:
parent
055fc2cb5e
commit
09fd42cb88
@ -52,9 +52,10 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#define MEVENT_MAX 64
|
||||
|
||||
#define MEV_ENABLE 1
|
||||
#define MEV_DISABLE 2
|
||||
#define MEV_DEL_PENDING 3
|
||||
#define MEV_ADD 1
|
||||
#define MEV_ENABLE 2
|
||||
#define MEV_DISABLE 3
|
||||
#define MEV_DEL_PENDING 4
|
||||
|
||||
extern char *vmname;
|
||||
|
||||
@ -147,10 +148,11 @@ mevent_kq_flags(struct mevent *mevp)
|
||||
int ret;
|
||||
|
||||
switch (mevp->me_state) {
|
||||
case MEV_ADD:
|
||||
ret = EV_ADD; /* implicitly enabled */
|
||||
break;
|
||||
case MEV_ENABLE:
|
||||
ret = EV_ADD;
|
||||
if (mevp->me_type == EVF_TIMER)
|
||||
ret |= EV_ENABLE;
|
||||
ret = EV_ENABLE;
|
||||
break;
|
||||
case MEV_DISABLE:
|
||||
ret = EV_DISABLE;
|
||||
@ -158,6 +160,9 @@ mevent_kq_flags(struct mevent *mevp)
|
||||
case MEV_DEL_PENDING:
|
||||
ret = EV_DELETE;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
return (ret);
|
||||
@ -284,7 +289,7 @@ mevent_add(int tfd, enum ev_type type,
|
||||
|
||||
LIST_INSERT_HEAD(&change_head, mevp, me_list);
|
||||
mevp->me_cq = 1;
|
||||
mevp->me_state = MEV_ENABLE;
|
||||
mevp->me_state = MEV_ADD;
|
||||
mevent_notify();
|
||||
|
||||
exit:
|
||||
|
Loading…
x
Reference in New Issue
Block a user