Next: Supermercado (SOLUCIÓN) Up: No Title Previous: No Title

# Supermercado

Un supermercado adquirió una base de datos sin capacidad para acceso concurrente. Dicha base de datos tenía el siguiente interfaz:

    DEFINITION MODULE BD;

    (* Tipo para el codigo de los productos: *)
    TYPE Codigos;

    (* Tipo para el nombre de los productos: *)
    TYPE Nombres;

    (* Tipo para el precio de los productos: *)
    TYPE Precios;

    PROCEDURE ReadDatos (
      VAR c : Codigos (*OUT*),
      VAR n : Nombres (*OUT*),
      VAR p : Precios (*OUT*)
    );
    (*
     * Procedimiento utilizado para leer por consola los datos de un
     * producto que posteriormente se va a actualizar.
     *)
    PROCEDURE LeerProducto (
      c : Codigos      (*IN*),
      VAR n : Nombres, (*OUT*)
      VAR p : Precios  (*OUT*)
    );
    (*
     * Acceso a la base de datos para consultar el nombre y el precio de
     * un producto.
     *)
    PROCEDURE ActualizarProducto (
      c : Codigos (*IN*),
      n : Nombres (*IN*),
      p : Precios (*IN*)
    );
    (*
     * Acceso a la base de datos para actualizar el producto indicado por
     * el codigo c con el nombre n y el precio p.
     *)
    END BD.

Las cajas registradoras sólo sumaban los precios introducidos a mano por el personal que las manejaba.

La dirección ha decidido adquirir unas nuevas cajas capaces de leer los códigos marcados en los productos. Para obtener el máximo partido de dicha inversion se pretende que las cajas accedan con dichos códigos a la base de datos (a través de `LeerProducto`).

Los datos de los productos (nombre y precio) se pueden actualizar (a través de `ActualizarProducto`) desde un puesto central. Al hacerlo, se quiere que los tickets sean consistentes, es decir, se quiere que en un ticket de una caja no pueda aparecer un mismo producto dos veces con nombre y/o precio diferente.

El grafo de procesos para el sistema a desarrollar es el siguiente:

El ejercicio consiste en

- definir e implementar un interfaz de acceso concurrente a la base de datos para los procesos en las cajas registradoras y el proceso operador del puesto central de tal forma que no se produzca el problema comentado,

- implementar el código de las tareas `Caja` y `Operador` suponiendo que existen las siguentes operaciones:

      PROCEDURE NuevoTicket (i : CARDINAL (*IN*));
      (*
       * NuevoTicket(i) es un procedimiento que al ejecutarlo el proceso
       * Caja(i) provoca que este quede bloqueado hasta la llegada de un
       * cliente.
       *)
      PROCEDURE SiguienteProducto (
        i : CARDINAL (*IN*),
        VAR fin : BOOLEAN (*OUT*),
        VAR c: Codigos (*OUT*)
      );
      (*
       * SiguienteProducto(i,fin,c) lo ejecuta Caja(i) y provoca la lectura
       * del codigo del siguiente producto, si no hay mas productos el valor
       * de c es no fiable y la fin adquiere el valor TRUE.
       *)

- favorecer en lo posible el funcionamiento sin pausas en las cajas. Las esperas es el puesto central son menos importantes, aunque, eso sí, debe garantizarse la ausencia de inanición.

Nota: la solución al ejercicio puede desarrollarse con mecanismo de monitores o de paso de mensajes síncrono, a elección del alumno.

- Supermercado (SOLUCIÓN)