====== 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]]