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