AUX 4 - CC41B
28 de Septiembre de 2007

Prof.: Luis Mateu
Aux.: Juan Manuel Barrios

Implementacion de timeouts en nSystem:

-Ver el codigo fuente de los mensajes (nMsg.c) y revisar como se implementa el
nReceive (ya que contiene un timeout).

-La implementacion de la espera se hace invocando al procedimiento
              ProgramTask(timeout)
el cual hace dormir a la tarea por la cantidad de milisegundos indicada.

-Si durante la espera en un nReceive, la tarea recibe un mensaje esta
despierta inmediatamente. Para ver como se implementa esto hay que revisar el
procedimiento nSend, donde en caso que el receptor este en una espera por
tiempo invoca el prodedimiento:
              CancelTask(task)

-Los procedimientos ProgramTask y CancelTask estan implementados en el archivo
nTime.c. Las tareas con timeout se guardan en la cola de prioridades
wait_squeue ordenados segun el tiempo que les falta para despertar, y se
programa una interrupcion para despertar mas tarde las tareas encoladas.

Tips para la implementacion de la tarea 2:

  -Toda tarea puede pertenecer solamente a una Queue a la vez, debido a que las
  colas de tareas se implementan como listas enlazadas sobre el campo
  next_task de nTask. Las FifoQueue son listas de objetos genericas que
  no usan el campo next_task.

  -En caso de querer encolar un nTask a dos Queue simultaneamente sucede un
  error. Si ocurre eso hay que revisar cuales colas se estan mezclando
  (puede ser la wait_squeue, ready_queue, la del monitor, etc.). La
  recomendacion es revisar bien los pasos en nTime.c para entender en que
  estado se duermen y despiertan las tareas.

  -Cuando se acaba el tiempo de un nWaitTimeout, el monitor podria estar tomado
  por otro proceso, por tanto primero debe esperar por el monitor para
  recuperarlo antes de continuar.

  -Si el timeout de nWaitTimeout es -1, entonces el comportamiento es similar
  a haber invocado nWait.

  -Si una tarea esta en la espera de un nWait o nWaitTimeout y alguien gatilla
  un nNotifyAll entonces la tarea en espera deben intentar recuperar el
  monitor de inmediato (independiente de cuanto le falte al timeout para
  terminar).

