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