====== Tarefas que esperam ======
Este projeto faz parte do [[PPOS-v2:start|PPOS v2]].
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(struct 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.
Observações:
* 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'' já tenha encerrado, esta chamada deve retornar imediatamente, sem suspender a tarefa atual.
* O valor de retorno da chamada ''task_wait'' é o //exit code// da tarefa que encerrou (informado como parâmetro de ''task_exit'').
**Sugestão**: crie uma fila de tarefas esperando; quando uma tarefa chamar ''task_wait'' ela é colocada nessa fila; quando uma tarefa encerra, o despachante percorre essa fila e acorda as tarefas que estiverem aguardando por ela.
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]].
===== Arquivos =====
Os seguintes arquivos são relevantes para este projeto:
* ''kernel/dispatcher.c''
* ''kernel/tcb.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
===== Outras informações =====
* Duração estimada: 4 horas.
* Dependências:
* [[Tarefas cooperativas]]
* [[Despachante de tarefas]]
* [[Preempção por Tempo]]