Bon, j'ai résoudru le problème de la pile : main est un scheduler qui appelle la fonction qui va bien :
schedule
void gl_main()
{
while(1)
{
// Schedule tasks
switch( NextTask )
{
case TASK_EXIT:
return;
case TASK_INTRO:
LoadIntro();
break;
case TASK_GAME:
LoadGame();
break;
}
CurTask = NextTask ;
InfiniteLoop();
}
}
Et dans InfiniteLoop(), on fait un return si CurTask a été mis à 0 par la tâche en cours.
C'est bien.

Enfin presque, faut que je trouve un moyen de faire passer une valeur d'une fonction à une autre maintenant...