Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_event.c
Context not available. | |||||
* process is gone, so flag the event as finished. | * process is gone, so flag the event as finished. | ||||
*/ | */ | ||||
if (event == NOTE_EXIT) { | if (event == NOTE_EXIT) { | ||||
/* | |||||
* If knote is in kqueue_scan() and process is exiting, before | |||||
* setting kn_knlist to null allow kqueue_scan to process the | |||||
* knote so that KN_LIST_LOCK and UNLOCK can succeed | |||||
*/ | |||||
if ((kn->kn_status & KN_SCAN) && (p->p_flag & P_WEXIT)) { | |||||
kn->kn_status |= KN_WAKEUP; | |||||
if (kn->kn_status & KN_HASKQLOCK) | |||||
KQ_UNLOCK(kn->kn_kq); | |||||
msleep(kn->kn_knlist, &p->p_mtx, PWAIT, "knexit", 0); | |||||
if (kn->kn_status & KN_HASKQLOCK) | |||||
KQ_LOCK(kn->kn_kq); | |||||
} | |||||
if (!(kn->kn_status & KN_DETACHED)) | if (!(kn->kn_status & KN_DETACHED)) | ||||
knlist_remove_inevent(&p->p_klist, kn); | knlist_remove_inevent(&p->p_klist, kn); | ||||
kn->kn_flags |= (EV_EOF | EV_ONESHOT); | kn->kn_flags |= (EV_EOF | EV_ONESHOT); | ||||
Context not available. | |||||
kn->kn_status &= ~(KN_INFLUX | KN_SCAN); | kn->kn_status &= ~(KN_INFLUX | KN_SCAN); | ||||
KN_LIST_UNLOCK(kn); | KN_LIST_UNLOCK(kn); | ||||
if (kn->kn_status & KN_WAKEUP) { | |||||
kn->kn_status &= ~KN_WAKEUP; | |||||
wakeup(kn->kn_knlist); | |||||
} | |||||
influx = 1; | influx = 1; | ||||
} | } | ||||
Context not available. |