218 | | * Le thread entrant n'a jamais été élu. Dans ce cas, le `jr $31` va nous faire entrer dans la fonction `thread_bootstrap()` dont le but est de lancer le thread en allant chercher les informations dans la structure `thread_s` du thread nouvellement élu, à savoir |
219 | | * la fonction de démarrage `_start()` ou `thread_start()` |
220 | | * la fonction principale du thread (uniquement pour les threads standards, c'est inutile pour le thread `main()`, on sait que c'est `main()`) |
221 | | * l'argument du thread (uniquement pour les threads standards, c'est inutile pour le thread `main()`, ce sont en principe des arguments de la ligne de commande (on ne voit pas ça pour le moment). |
222 | | * Le thread avait déjà été élu et donc il avait perdu le processeur et il avait appelé `thread_save()`. |
223 | | * En conséquence, on sortira de `thread_load()` par `thread_save()` et on revient dans `sched_switch()`. |
224 | | * Pour qu'on ne rentre pas dans une boucle sans fin, la valeur de retour de `thread_save()` après une restauration de contexte est `0` (alors que c'est `1` après une sauvegarde). On teste donc cette valeur de retour de `thread_save()` pour savoir ce qu'on doit faire ensuite. |
225 | | * On sort ensuite de `sched_switch()` et on revient dans `thread_yield()` (actuellement c'est le seul cas, mais nous verrons d'autres fonctions appelant `sched_switch())`. |
226 | | * Après, on revient dans un syscall ou dans l'ISR du timer, suivant l'événement qui avait abouti à la perte du processeur par le thread courant. |
227 | | |
| 218 | * Si le thread entrant n'a jamais été élu, alors dans ce cas, le `jr $31` va nous faire entrer dans la fonction `thread_bootstrap()` dont le but est de lancer le thread en allant chercher les informations dans la structure `thread_s` du thread nouvellement élu, c'est-à-dire : |
| 219 | * 1) l'une des fonctions de démarrage : si c'est le main `_start()`; si c'est un thread `thread_start()` |
| 220 | * 2) la fonction principale du thread (uniquement pour les threads standards, c'est inutile pour le thread `main()`, on sait que c'est `main()`) |
| 221 | * 3) l'argument du thread (uniquement pour les threads standards, c'est inutile pour le thread `main()`. Les arguments de mains sont, en principe, ceux de la ligne de commande, mais on ne voit pas ça pour le moment. |
| 222 | * Si le thread entrant a déjà été élu et donc qu'il a perdu le processeur dans le passé, alors il avait appelé `thread_save()`. |
| 223 | * En conséquence, on sortira de `thread_load()` par `thread_save()` et il revient dans `sched_switch()`. |
| 224 | * Pour qu'on ne rentre pas dans une boucle sans fin, la valeur de retour de `thread_save()` après une restauration de contexte est `0` (alors que c'est `1` après une sauvegarde). On teste donc cette valeur de retour de `thread_save()` pour savoir ce qu'on doit faire ensuite. |
| 225 | * On sort ensuite de `sched_switch()` et on revient dans `thread_yield()`. |
| 226 | * Après, on revient dans un syscall ou dans l'ISR du timer, suivant l'événement qui avait abouti à la perte du processeur par le thread courant. |