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

d2 kos-dev@enix.org
26 May 2003 19:16:54 +0200


Oui, nos waitqueue ressemblent en effet fortement a des conditions. Et
dans ce cas, faut appliquer le principe des conditions : leur passer
un mutex. Pour l'instant, donc, nos synchros mutex/sem reposent sur
des conditions qui n'en sont pas vraiment. Lire la suite, c'est mieux,
pour comprendre que les modifs sont ridicules a faire.

Ca serait plus simple de faire l'inverse : ne pas laisser les
conditions (ie l'API kwaitqueue_add/wakeup chez nous) comme element
*de synchro* "de base" et faire reposer les autres algos dessus (sem,
mutex, ...). A a la place, faudrait implanter les semaphores/mutex
d'abord, sans appel a l'API kwaitqueue_add/kwaitqueue_wakeup, mais en
continuant d'utiliser la *structure* waitqueue et le principe que
toutes les ressources (sem/mutex/...) ont une structure waitqueue de
threads (au sens *structure* qui rassemble une liste de threads et un
nom, pas au sens de l'API kwaitqueue_add/waitqueue_wakeup). Cad qu'on
revoie les synchros sem/mutex pour les faire reposer sur cette
*structure* waitqueue, sans les faire appeler les 2 primitives de
l'API waitqueue_add/waitqueue_wakeup.

Bref : en ce qui nous concerne, ca veut dire que dans sem/mutex, on
ne se passe pas de la gestion des waitqueue au sens "structurel"
(ajout suppression), mais qu'on se passe d'elles au sens
"synchro".

==> 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.

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).

-- 
d2