From: dpasukhi Date: Fri, 3 May 2024 10:07:32 +0000 (+0100) Subject: Fixed parallel execution problem X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=7bca47b926ed7ebcd7e921d70281d1b9b17a6427;p=occt.git Fixed parallel execution problem --- diff --git a/src/DataExchange/TKXSBase/LibCtl/LibCtl_Library.gxx b/src/DataExchange/TKXSBase/LibCtl/LibCtl_Library.gxx index d7fcef9f2b..3d4a948059 100644 --- a/src/DataExchange/TKXSBase/LibCtl/LibCtl_Library.gxx +++ b/src/DataExchange/TKXSBase/LibCtl/LibCtl_Library.gxx @@ -15,6 +15,8 @@ //#include #include +#include + // Liste Globale des Modules, dans laquelle on va se servir @@ -25,6 +27,8 @@ static Handle(LibCtl_GlobalNode) theglobal; static Handle(TheProtocol) theprotocol; static Handle(LibCtl_Node) thelast; +static Standard_Mutex THE_LIBRARY_MUTEX; + // Alimentation de la liste globale // ATTENTION : SetGlobal fait de la substitution, c-a-d que c est le dernier @@ -32,6 +36,7 @@ static Handle(LibCtl_Node) thelast; void LibCtl_Library::SetGlobal (const Handle(TheModule)& amodule, const Handle(TheProtocol)& aprotocol) { + Standard_Mutex::Sentry aLocker (THE_LIBRARY_MUTEX); if (theglobal.IsNull()) theglobal = new LibCtl_GlobalNode; theglobal->Add(amodule,aprotocol); } @@ -39,6 +44,7 @@ static Handle(LibCtl_Node) thelast; // Constructeur d apres Protocole LibCtl_Library::LibCtl_Library (const Handle(TheProtocol)& aprotocol) { + Standard_Mutex::Sentry aLocker (THE_LIBRARY_MUTEX); Standard_Boolean last = Standard_False; if (aprotocol.IsNull()) return; // PAS de protocole = Lib VIDE if (!theprotocol.IsNull()) last = @@ -66,7 +72,7 @@ static Handle(LibCtl_Node) thelast; // librairies, doit toujours renvoyer le type le plus haut Handle(TheProtocol) aproto = Handle(TheProtocol)::DownCast(aprotocol); if (aproto.IsNull()) return; - + Standard_Mutex::Sentry aLocker (THE_LIBRARY_MUTEX); // D abord, ajouter celui-ci a la liste : chercher le Node Handle(LibCtl_GlobalNode) curr; for (curr = theglobal; !curr.IsNull(); ) { // curr->Next : plus loin @@ -86,7 +92,7 @@ static Handle(LibCtl_Node) thelast; for (Standard_Integer i = 1; i <= nb; i ++) { AddProtocol (aproto->Resource(i)); } -// Ne pas oublier de desoptimiser + // Ne pas oublier de desoptimiser theprotocol.Nullify(); thelast.Nullify(); } @@ -96,6 +102,7 @@ static Handle(LibCtl_Node) thelast; void LibCtl_Library::SetComplete () { + Standard_Mutex::Sentry aLocker (THE_LIBRARY_MUTEX); thelist = new LibCtl_Node; // On prend chacun des Protocoles de la Liste Globale et on l ajoute Handle(LibCtl_GlobalNode) curr; @@ -116,6 +123,7 @@ static Handle(LibCtl_Node) thelast; Handle(TheModule)& module, Standard_Integer& CN) const { module.Nullify(); CN = 0; // Reponse "pas trouve" + Standard_Mutex::Sentry aLocker (THE_LIBRARY_MUTEX); if (thelist.IsNull()) return Standard_False; Handle(LibCtl_Node) curr = thelist; for (curr = thelist; !curr.IsNull(); ) { // curr->Next : plus loin