[Kos-dev] Implémentation des sémap hores dans FreeBSD

Thomas Petazzoni kos-dev@enix.org
Mon, 26 May 2003 20:12:22 +0200


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

Bonjour,

> ==> Donc en bref, il suffit de moidifier sem/mutex pour qu'ils
> appellent directement kwaitqueue_add_unsafe() + un equivalent unsafe
> pour le wakeup, plutot que directement kwaitqueue_add/wakeup. Et c'est
> tout. Apres faudra aussi renommer kwaitqueue_add/wakeup et
> condition_wait/signal qui prennent un mutex en parametre, et mettre a
> jour timer.

Il me semblerait alors plus sage d'implémenter sem/mutex (au moins) dans
le module scheduler, non ?

En fait ce que j'aurai aimé, c'est que le module scheduler ne s'occupe
*que* d'élire le prochain thread : c'est la politique d'élection que
j'aimerais voir externalisée dans un module séparé. Faudrait voir dans
quelle mesure c'est possible, je ne sais pas.

> Et en y reflechissant, en effet : les sem/mutex n'ont pas besoin d'un
> lock general sur le global_waitqueue_lock !  Ca n'a pas de sens
> puisque le global_waitqueue_lock sert a proteger le destroy de
> kwaitqueues, or pour un sem/mutex, la structure kwaitqueue est /deja/
> protegee des destroy par le lock global des sem/mutex... (on detruit
> tout le semaphore, pas seulement la waitqueue qui y est integree).

Effectivement à priori ça fonctionne (j'avais cru trouvé un problème
potentiel en SMP, mais en fait, non je me suis encore emmelé les
pinceaux). A mon avis, il faudrait écrire les fonctions suivantes :

 * kwaitqueue_init_unsafe
 * kwaitqueue_destroy_unsafe
 * kwaitqueue_add_unsafe (qui devra prendre en plus un lock, et des
flags pour les passer à spin_unlock ??)
 * kwaitqueue_wake_up_unsage
 * kwaitqueue_is_empty_unsafe

Ces fonctions ne prennent aucun lock (surtout pas un
kwaitqueue_global_lock), sauf un lock permettant de protéger la
cpu_waitqueue (pour l'instant protégé par le kwaitqueue_global_lock).

Ensuite, on pourra proposer une implémentation des waitqueues, des
sémaphores et des mutexes qui repose directement sur ces fonctions *_unsafe.

Qu'en dites-vous ?

Moi, ça me parait bien, sauf l'histoire du flags pour le _add_unsafe.

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+0lkG9lPLMJjT96cRAjErAKCXi/8OD/mJh+/dNsdpEVTTHXeOegCfT74H
VkxxX3mlwhmfMcrjS/C6nho=
=434x
-----END PGP SIGNATURE-----