[Kos-dev] "Race condition" 1
d2
kos-dev@enix.org
26 May 2003 09:59:39 +0200
Hello,
Pour le thread_to_destroy, a mon avis le vrai probleme est
ailleurs. Normalement, il faudrait garantir que quand on fait le
context switch, les interruptions sont desactivees. D'ailleurs c'est
fait avant le switch_internal (ASSERT_FATAL(test_interrupt_enabled()
== FALSE);). La ou y'a un truc anormal d'apres tes explications,
c'est qu'on se fait quand meme preempter entre le retour du
switch_internal "asm" (ie apres le iret) et la suite du cpl0_switch
"C" : c'est donc soit :
- qu'il y'a preemption vers un thread tout neuf qui 1/ a les
interruptions activees, 2/ ne verifie pas a son demarrage qu'il
y'a pas 1 thread dans thread_to_be_destroyed.
- qu'il y'a preemption entre le reschedule_after_termination() et la
fin du switch_no_return
- que pour une raison inconnue les interruptions repassent enabled
apres le iret => rajouter un ASSERT_FATAL(test_interrupt_enabled()
== FALSE); apres le switch_internal "asm" dans le cpl0_switch "C".
A mon avis il faut privilegier la premiere explication (ie
tester...)..., puis faire :
- modif eflags dans init_kernel_thread_context pour positionner
le bit IE a 0
- modif execute_thread pour ajouter :
static void execute_thread(kernel_thread_fct_t *kt, void *data)
{
if (thread_to_be_destroyed != NULL)
{
thread_t *thread_to_destroy = thread_to_be_destroyed;
thread_to_be_destroyed = NULL;
delete_kernel_thread(thread_to_destroy);
}
sti();
kt(data);
reschedule_after_termination();
}
Pour les semaphores, faudrait reflechir en effet, pour le moment je
pense que ce serait plus propre de passer un spinlock en parametre. Le
probleme que je me pose c'est "est-ce qu'on risque pas", avec
l'empilement de nos synchro les unes sur les les autres (kmsg / ksem /
kwq), "d'avoir besoin de relacher *plusieurs* wq au moment du
switch"...
En tous cas, Merci Thomas. Je suis arrive a 1h30 ce matin a Rennes,
soit 1h plus tard que prevu. Ce matin, c'est dur.
Bonne journee,
--
d2