use kq_mtx

git-svn-id: svn://svn.code.sf.net/p/libkqueue/code/trunk@193 fb4e3144-bc1c-4b72-a658-5bcd248dd7f7
This commit is contained in:
mheily 2010-02-08 03:04:20 +00:00
parent 3796661e67
commit f4a842909a
2 changed files with 11 additions and 2 deletions

View File

@ -249,13 +249,15 @@ kevent(int kqfd, const struct kevent *changelist, int nchanges,
* Process each kevent on the changelist.
*/
if (nchanges) {
pthread_mutex_lock(&kq->kq_mtx);
rv = kevent_copyin(kq, changelist, nchanges, eventlist, nevents);
if (rv < 0)
return (-1);
goto errout;
if (rv > 0) {
eventlist += rv;
nevents -= rv;
}
pthread_mutex_unlock(&kq->kq_mtx);
}
/* Determine if we need to wait for events. */
@ -286,4 +288,8 @@ kevent(int kqfd, const struct kevent *changelist, int nchanges,
#endif /* KQUEUE_DEBUG */
return (nret);
errout:
pthread_mutex_unlock(&kq->kq_mtx);
return (-1);
}

View File

@ -48,6 +48,7 @@ kevent_copyout(struct kqueue *kq, int nready,
struct filter *filt;
int i, rv, nret;
pthread_mutex_lock(&kq->kq_mtx);
nret = 0;
for (i = 0; (i < EVFILT_SYSCOUNT && nready > 0 && nevents > 0); i++) {
// dbg_printf("eventlist: n = %d nevents = %d", nready, nevents);
@ -59,7 +60,8 @@ kevent_copyout(struct kqueue *kq, int nready,
rv = filt->kf_copyout(filt, eventlist, nevents);
if (rv < 0) {
dbg_puts("kevent_copyout failed");
return (-1);
nret = -1;
break;
}
nret += rv;
eventlist += rv;
@ -67,6 +69,7 @@ kevent_copyout(struct kqueue *kq, int nready,
nready--;
}
}
pthread_mutex_unlock(&kq->kq_mtx);
return (nret);
}