diff options
author | Stephan Uphoff <ups@FreeBSD.org> | 2005-09-15 21:10:12 +0000 |
---|---|---|
committer | Stephan Uphoff <ups@FreeBSD.org> | 2005-09-15 21:10:12 +0000 |
commit | 19b2dff7b0d943d246e66b44f92ed81cee078d10 (patch) | |
tree | 774450f4cf1544a2a2b520cf54e002e82424da65 /sys/kern/kern_event.c | |
parent | 21f9e816cd757dd676d70052dd403a645b961ae3 (diff) | |
download | src-19b2dff7b0d943d246e66b44f92ed81cee078d10.tar.gz src-19b2dff7b0d943d246e66b44f92ed81cee078d10.zip |
Fix race condition that caused activation of an event to
be ignored immediately after it was deactivated.
Found by: Yahoo!
MFC after: 3 days
Notes
Notes:
svn path=/head/; revision=150199
Diffstat (limited to 'sys/kern/kern_event.c')
-rw-r--r-- | sys/kern/kern_event.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 2e71f23d29db..3aa4550243b9 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -1242,11 +1242,11 @@ start: KQ_GLOBAL_LOCK(&kq_global, haskqglobal); KN_LIST_LOCK(kn); if (kn->kn_fop->f_event(kn, 0) == 0) { - KN_LIST_UNLOCK(kn); KQ_LOCK(kq); kn->kn_status &= ~(KN_QUEUED | KN_ACTIVE | KN_INFLUX); kq->kq_count--; + KN_LIST_UNLOCK(kn); continue; } *kevp = kn->kn_kevent; @@ -1258,8 +1258,10 @@ start: kq->kq_count--; } else TAILQ_INSERT_TAIL(&kq->kq_head, kn, kn_tqe); - KN_LIST_UNLOCK(kn); + kn->kn_status &= ~(KN_INFLUX); + KN_LIST_UNLOCK(kn); + } /* we are returning a copy to the user */ |