CRLG / LABOTBOX

Outil de contrôle et mise au point pour robot CRLG
GNU General Public License v3.0
2 stars 1 forks source link

[DataManager] Plantage aléatoire de Labotbox lors d’événements liés au DataManager #43

Closed NicoFarmer closed 4 years ago

NicoFarmer commented 4 years ago

Aléatoirement, Labotbot plante complètement lorsque des événements arrivent sur le DataManager durant le fonctionnement.

NicoFarmer commented 4 years ago

Après analyse, il s'avère qu'il y a un blocage de mutex. Il y a 2 types de mutex dans la gestion des Data de Labotbox :

Le cas observé est un cas de blocage du mutex au niveau du DataManager. Lorsqu'on passe par le DataManager pour mettre à jour une Data, le DataManager bloque le mutex avant de mettre à jour la Data et envoie les signaux de mise à jour. Tout slot abonné à ce signal et faisant appel au DataManager se verra bloqué indéfiniment (car le mutex a été pris au départ et non libéré)

De plus, lorsque des signaux sont lancés à l'application pour indiquer qu'une Data à changé de valeur ou a été mise à jour, les slots abonnés à ces signaux sont appelés immédiatement. Au moment de l'appel du signal, le mutex de la Data n'est pas encore libéré, donc, tout slot qui fera appel à cette même Data se verra bloqué indéfiniment car le mutex de cette Data sera déjà bloqué.

Modification de la gestion du mutex du DataManager Il n'est pas nécessaire de bloquer le mutex du DataManager lorsqu'une donnée est mise à jour car chaque donnée possède déjà son propre mutex de protection contre les accès concurrents.

Modification de la gestion du mutex des Data Le mutex doit être pris uniquement au moment de l'écriture dans la Data et libéré immédiatement après. Le mutex de la Data doit impérativement être libéré avant d'appeler les signaux de modification ou mise à jour de la Data.

NicoFarmer commented 4 years ago

Correction apportée dans la classe CData et le module DataManager tel que décrit dans l'analyse.