Tarefas que esperam
Este projeto faz parte do 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
bencerre, então todas elas têm de ser acordadas quando isso ocorrer. - Caso a tarefa
bjá 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 detask_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.ckernel/tcb.hkernel/task.ctest/pingpong-wait.c: teste da funçãotask_waittest/pingpong-wait-stress.c: teste de stress da funçãotask_wait(com muitas tarefas)test/pingpong-wait*.txt: saídas esperadas dos testes
Outras informações
- Duração estimada: 4 horas.
- Dependências: