PERFORCE change 123644 for review
Roman Divacky
rdivacky at FreeBSD.org
Tue Jul 17 11:54:28 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=123644
Change 123644 by rdivacky at rdivacky_witten on 2007/07/17 11:53:41
Working epoll. At least it seems so. This lacks testing but the very basic one.
Affected files ...
.. //depot/projects/soc2007/rdivacky/linux_epoll/sys/compat/linux/linux_epoll.c#6 edit
Differences ...
==== //depot/projects/soc2007/rdivacky/linux_epoll/sys/compat/linux/linux_epoll.c#6 (text+ko) ====
@@ -69,7 +69,7 @@
filter |= EVFILT_WRITE;
if (event->events & LINUX_EPOLLPRI)
filter |= EVFILT_READ;
- if (event->events & LINUX_EPOLLET) /* XXX: ? */
+ if (event->events & LINUX_EPOLLET) /* XXX: not sure about this */
flags |= EV_CLEAR;
if (event->events & LINUX_EPOLLONESHOT)
flags |= EV_ONESHOT;
@@ -80,11 +80,22 @@
static void
linux_kevent_to_epoll(struct kevent *kevent, struct linux_epoll_event *event)
{
- /* XXX: testing only!!! */
- if (kevent->data > 0)
- event->events = LINUX_EPOLLIN;
-
- event->data = LINUX_EPOLL_CTL_ADD;
+ if (kevent->flags & EV_ERROR) {
+ /* XXX: error handling */
+ return;
+ }
+ switch (kevent->filter) {
+ case EVFILT_READ:
+ if (kevent->data > 0)
+ event->events = LINUX_EPOLLIN;
+ event->data = kevent->ident;
+ break;
+ case EVFILT_WRITE:
+ if (kevent->data > 0)
+ event->events = LINUX_EPOLLOUT;
+ event->data = kevent->ident;
+ break;
+ }
}
static int
@@ -95,7 +106,6 @@
int error, i;
uap = (struct kevent_args*) arg;
- printf("Copyout: %i\n", count);
eep = malloc(sizeof(*eep) * count, M_TEMP, M_WAITOK | M_ZERO);
@@ -117,13 +127,9 @@
struct kevent_args *uap;
uap = (struct kevent_args*) arg;
- printf("count: %i\n", count);
memcpy(kevp, uap->changelist, count * sizeof(*kevp));
- printf("KeventX: %i, %i, %i, %i\n", kevp->ident, kevp->filter, kevp->flags, kevp->fflags);
- printf("KeventY: %i, %i, %i, %i\n", uap->changelist->ident, uap->changelist->filter, uap->changelist->flags, uap->changelist->fflags);
-
uap->changelist += count;
return (0);
@@ -144,8 +150,11 @@
error = copyin(args->event, &le, sizeof(le));
if (error)
return (error);
- printf("epoll_ctl: %i, %i, %i, %u\n", args->epfd, args->op,
- args->fd, le.events);
+#ifdef DEBUG
+ if (ldebug(epoll_ctl))
+ printf(ARGS(epoll_ctl,"%i, %i, %i, %u"), args->epfd, args->op,
+ args->fd, le.events);
+#endif
k_args.fd = args->epfd;
k_args.changelist = &kev; /* epoll can register only 1 filter at once*/
k_args.nchanges = 1;
@@ -167,7 +176,6 @@
}
linux_epoll_to_kevent(args->fd, &le, &kev);
- printf("Kevent: %i, %i, %i, %i\n", kev.ident, kev.filter, kev.flags, kev.fflags);
return kern_kevent(td, args->epfd, 1, 0, &k_ops, NULL);
}
More information about the p4-projects
mailing list