Tarea 3 CC41B


Plazo: 2 semanas

Descripción

Se trata de hacer un dispositivo /dev/tunnel, que sirva para la sincronización de las tareas que quieren usar un tunel como el de la tarea2. Para ello, el dispositivo debe soportar: open, write (que es como entry) y read (que es como move). El dispositivo debe representar el tunel y los espacios ocupados, de modo de ir bloqueando a las tareas llamadoras en la sincronización.

Para que funcione, se requiere que las tareas sean implementadas por el kernel, por que en ese caso son igual que procesos independientes. Por ello, no se puede ocupar nSystem, y usaremos pthreads llamando a read y write.

Las primitivas a implementar deben funcionar de la siguiente forma:

// entry a tunnel de un item con prior count
int write(fd, buf, count); // buf apunta a un int que tiene el numero de item
                           // count es la prioridad con la que se espera entrar
// move dentro de tunnel de un item que uso esa prioridad
int read(fd, buf, count); // buf apunta a un int que tiene el numero de item
                          // count es un entero con la prioridad
                          // retorna EOF (0) cuando salió del tunel
int ioctl(fd, IOC..., arg); // RESET, GETSIZE, SETSIZE y WAIT

Un programa que resuelve esto usando pthreads se les entrega de ejemplo, usando el device /dev/tunnel y recibiendo de argumentos los autos y el tamaño del tunel.

Deben probar la tarea con ese mismo programa. Usa todos los ioctls que se piden: RESET para volver a un tunel vacio, GETSIZE que obtiene el largo del tunel, SETSIZE que modifica el largo del tunel y WAIT que obtiene el largo de la cola de espera para una prioridad. Miren el código para ver como se usan. Mientras no los hayan implementado, comenten esas lineas.

La tarea3 consiste en escribir el código para un módulo cargables que implemente ese driver. El sentido de las prioridades es el mismo de la tarea2.

Se incluye un Makefile y otros archivos para compilarlos en tarea3.tgz, lo que incluye una versión de wish.c modificado para correr con threads y el tunnel.h. Por supuesto, no pueden probar ese programa si no tienen un device /dev/tunnel en su sistema.

Pruebas

Para probar el ejecutable (suponiendo que tienen un /dev/tunnel):

% ./nautos2 200 50 | wish

Condiciones de Entrega

La tarea debe realizarse en C usando los Makefiles habituales de los drivers. Entreguen todos los archivos, incluido el Makefile.

La tarea debe entregarse antes del plazo final a través de U-cursos y debe compilar sin errores y ejecutar, o no será evaluada. Si tienen una tarea que funciona en parte, pero no completa, entréguenla a tiempo y obtendrán algo de nota. Los ioctl son lo último a implementar. En el código de ejemplo, se pueden comentar las líneas con ioctl y usar el tunel de largo default siempre. Cada función ioctl que implementen les da un poco de puntaje más.