/********************************************************************** TERMINATE Si occupa di: -Uccidere root e tutti i figli ricorsivamente -Rimettere i thread nella lista dei liberi -Togliere i thread dalle varie liste/array in cui sono presenti -Decrementare il valore di thread_count -Pulire la inbox da eventuali messaggi **********************************************************************/ void terminate (tcb_t *target) { msg_t *msg; tcb_t *child; /* Se ha un padre lo elimino dai suoi figli */ outChild(target); /* Caso ricorsivo -> HA figli (su cui viene chiamata la terminate) */ while (TRUE) { if ( (child = removeChild(target)) == NULL ) break; /* Passa al caso base e pulisce thread, liste, messaggi... */ terminate(child); } /* Caso base -> NON ha figli */ /* Se è in qualche lista o è il thread corrente lo elimino */ if (((outThread(&ready_queue, target)) != NULL) || (current_thread == target)) { /* Pulisco la inbox */ while (TRUE) { if ( (msg = popMessage(&(target->t_inbox), NULL)) == NULL ) break; freeMsg(msg); } /* Se è un manager lo elimino dal trap_managers array */ delete_manager(target); if (current_thread == target) current_thread=NULL; /* Restituisco ai thread liberi */ freeTcb(target); thread_count--; } else if (outThread(&wait_queue, target)) { /* Decremento contatore processi in attesa I/O o SSI */ if (target->waiting_for == SSI_tcb) soft_block_count--; /* Tutto come caso precedente*/ while (TRUE) { if ( (msg = popMessage(&(target->t_inbox), NULL)) == NULL ) break; freeMsg(msg); } delete_manager(target); freeTcb(target); thread_count--; } else PANIC(); }
int main(int argc, char **argv) { new_manager(); FiberManager *fm = get_manager(); fm->add(hectate_fiber, argc, argv); while (fm->size()) { fm->run(); } delete_manager(); std::wcout << "Goodbye." << std::endl; return 0; }