[Kos-dev] "Race condition" 1

Thomas Petazzoni kos-dev@enix.org
Wed, 28 May 2003 00:25:54 +0200


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello,

> Malheureusement, il y a encore une race condition quelque part, parce
> que quand j'ai 2 suppressions de threads très très rapprochées :

J'ai expérimenté un peu, en essayant d'utiliser des méthodes le moins
intrusives possibles (envoi de caracteres en direct sur le port E9).

En gros, j'affiche un caractère juste avant le iret de
cpl0_switch_no_return_internal, un autre caractère juste avant le iret
de cpl0_switch_with_return_internal, un juste au démarrage de la
fonction cpl0_switch_with_no_return, et un juste après le retour de
l'appel à cpl0_switch_with_return_internal dans cpl0_switch_with_return.

Et le problème apparait clairement :
 * Un thread vient de se terminer -> on arrive dans cpl0_switch_no_return
 *  On rentre dans cpl0_switch_no_return, et on en sort
 * Et la, au lieu de repasser par cpl0_switch_with_return (c'est
pourtant la ou le thread elu devrait etre bloque), et bien on se
retrouve de nouveau dans cpl0_switch_with_return, avec donc forcément
une ASSERTion qui pète (car thread_to_destroy est != NULL).

Donc clairement il y a une interruption qui intervient entre les deux
(d'autant plus que sur le cas que je viens d'éxécuter, j'ai un '\n'
juste entre la fin de cpl0_switch_no_return_internal et le rappel à
cpl0_switch_no_return, ce qui signifie que quelqu'un a pu afficher un
caractere.

Voila l'analyse que je peux avoir pour le moment du probleme. La
prochaine étape consistera à afficher la valeur de eflags restaurée par
iret, mais j'ai encore un peu de mal à appeler une fonction en
assembleur sans écrabouiller des registres, pourtant je fais :
 pushl %eax // sauvegarde eax
 movl 4(%esp), %eax //on choppe le eflags
 pushl %eax // on empile pour l'appel
 call ma_fonction // on appelle
 addl $4, %esp // on rattrape l'empilage de l'argument
 popl %eax // restaure eax

Sinon, avec les outb pour débugger avec Bochs, j'ai du monter à 200
threads pour que le bug se reproduise.

Voila pour mes expérimentations de la soirée. Qu'en pensez-vous ?

Thomas
- --
PETAZZONI Thomas - thomas.petazzoni@enix.org - UIN : 34937744
http://www.enix.org/~thomas/
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E  1624 F653 CB30 98D3 F7A7
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)
Comment: Using GnuPG with Debian - http://enigmail.mozdev.org

iD8DBQE+0+Xx9lPLMJjT96cRAh9KAKCTrB+tABaGmq1T9E9hqVim9vDDWACgxUT/
URxt3PNx3T1UJ9MkUZ3rOaE=
=nBb5
-----END PGP SIGNATURE-----