Tarefas que esperam

O objetivo deste projeto é construir a função task_wait, que permite a uma tarefa suspender-se para esperar a conclusão de outra, de forma similar às chamadas POSIX wait e pthread_join:

int task_wait (task_t *task)

A chamada task_wait (b) faz com que a tarefa atual (corrente) seja suspensa até a conclusão da tarefa b. Mais tarde, quando a tarefa b encerrar (usando a chamada task_exit), a tarefa suspensa deve retornar à fila de tarefas prontas. Lembre-se que várias tarefas podem ficar aguardando que a tarefa b encerre, então todas elas têm de ser acordadas quando isso ocorrer.

Caso a tarefa b não exista ou já tenha encerrado, esta chamada deve retornar imediatamente, sem suspender a tarefa atual.

O valor de retorno da chamada task_wait deve ser o código de encerramento da tarefa b (valor exit_code informado como parâmetro de task_exit), ou -1, caso a tarefa indicada não exista ou algum outro erro.

Para facilitar a construção deste e dos próximos projetos, deve-se usar as funções task_suspend e task_awake implementadas no projeto Despachante de tarefas.

Os seguintes arquivos são relevantes para este projeto:

  • kernel/dispatcher.c
  • kernel/taskdata.h
  • kernel/task.c
  • test/pingpong-wait.c: teste da função task_wait
  • test/pingpong-wait-stress.c: teste de stress da função task_wait (com muitas tarefas)
  • test/pingpong-wait*.txt: saídas esperadas dos testes
  • ppos-v2/tarefas_que_esperam.txt
  • Última modificação: 2025/09/04 15:52
  • por maziero