Je travaille sur un devoir qui sera dû au prochain semestre. Cela nous oblige à implémenter notre propre bibliothèque de changement de contexte/thread en utilisant l'API ucontext. Le professeur fournit le code qui le fait, mais avant qu'un thread ne retourne, il fait manuellement un travail et appelle un ISR qui trouve un autre thread à utiliser et swapcontexts ou, s'il n'en reste aucun, se termine.makecontext segfault?
Le point de l'affectation est d'utiliser le champ uc_link du contexte afin que, lorsqu'il renvoie un résultat, il se charge du travail. J'ai créé une fonction (type void/void args) qui fait juste le travail que les fonctions ont fait avant (nettoyer et appelle ensuite ISR). Le professeur a dit qu'il voulait ça.
Il ne reste donc plus qu'à faire un makecontext quelque part sur le contexte dans le champ uc_link pour qu'il exécute mon thread, n'est-ce pas? Eh bien, quand je fais makecontext sur apparemment n'importe quelle combinaison de ucontext_t et de fonction, je reçois un segfault et gdb ne fournit aucune aide .. Je peux passer le makecontext et mon programme existe «normalement» quand il rentre dans les threads que j'ai créés parce que (vraisemblablement) le champ uc_link n'est pas correctement configuré (ce que j'essaie de faire).
Je ne trouve rien sur les raisons pour lesquelles makecontext segfault. Quelqu'un peut-il aider?
stack2.ss_sp = (void *)(malloc(STACKSIZE));
if(stack2.ss_sp == NULL){
printf("thread failed to get stack space\n");
exit(8);
}
stack2.ss_size = STACKSIZE;
stack2.ss_flags = 0;
if(getcontext(&main_context) == -1){
perror("getcontext in t_init, rtn_env");
exit(5);
}
//main_context.uc_stack = t_state[i].mystk;
main_context.uc_stack = stack2;
main_context.uc_link = 0;
makecontext(&main_context, (void (*)(void))thread_rtn, 0);
J'ai aussi essayé juste thread_rtn, & thread_rtn et d'autres choses. thread_rtn est déclaré comme void thread_rtn (void).
plus tard, dans chaque thread. run_env est de type ucontext_t: ...
t_state[i].run_env.uc_link = &main_context;
Veuillez poster du code, ici ou sur quelque chose comme pastebin. –
Quelle est la taille de votre STACKSIZE? – nos