0029195: OCAF - ensure thread safety for different documents.
[occt.git] / src / CDF / CDF_Session.cxx
index 7c15099..91e6eb7 100644 (file)
 
 IMPLEMENT_STANDARD_RTTIEXT(CDF_Session,Standard_Transient)
 
-static Handle(CDF_Session) CS;
+static Handle(CDF_Session) THE_CS;
+static Standard_Mutex THE_MUTEX;
 
 //=======================================================================
 //function : 
 //purpose  : 
 //=======================================================================
-CDF_Session::CDF_Session () : myHasCurrentApplication(Standard_False)
+CDF_Session::CDF_Session ()
 {  
-  Standard_MultiplyDefined_Raise_if(!CS.IsNull()," a session already exists");
-  myDirectory = new CDF_Directory();
-  CS = this;
+  Standard_MultiplyDefined_Raise_if(!THE_CS.IsNull()," a session already exists");
 }
 
 //=======================================================================
-//function : Exists
+//function : 
 //purpose  : 
 //=======================================================================
-Standard_Boolean CDF_Session::Exists() {
-  return !CS.IsNull();
+Handle(CDF_Session) CDF_Session::Create()
+{
+  Standard_Mutex::Sentry aLocker(THE_MUTEX);
+  if (THE_CS.IsNull())
+    THE_CS = new CDF_Session;
+  return THE_CS;
 }
 
 //=======================================================================
-//function : Directory
+//function : Exists
 //purpose  : 
 //=======================================================================
-Handle(CDF_Directory) CDF_Session::Directory() const {
-  
-  return CS->myDirectory;
+Standard_Boolean CDF_Session::Exists() {
+  return !THE_CS.IsNull();
 }
 
 //=======================================================================
@@ -69,63 +71,65 @@ Handle(CDF_Directory) CDF_Session::Directory() const {
 //purpose  : 
 //=======================================================================
 Handle(CDF_Session) CDF_Session::CurrentSession() {
-  Standard_NoSuchObject_Raise_if(CS.IsNull(), "no session has been created");
-  return CS;
-}
-
-//=======================================================================
-//function : HasCurrentApplication
-//purpose  : 
-//=======================================================================
-Standard_Boolean CDF_Session::HasCurrentApplication() const {
-  return myHasCurrentApplication;
-}
-
-//=======================================================================
-//function : CurrentApplication
-//purpose  : 
-//=======================================================================
-Handle(CDF_Application) CDF_Session::CurrentApplication() const {
-  Standard_NoSuchObject_Raise_if(!myHasCurrentApplication,"there is no current application in the session");
-  return myCurrentApplication;
+  Standard_NoSuchObject_Raise_if(THE_CS.IsNull(), "no session has been created");
+  return THE_CS;
 }
 
 //=======================================================================
-//function : SetCurrentApplication
-//purpose  : 
+//function : AddApplication
+//purpose  : adds the application to the session with unique name
 //=======================================================================
-void CDF_Session::SetCurrentApplication(const Handle(CDF_Application)& anApplication) {
-  myCurrentApplication  = anApplication;
-  myHasCurrentApplication = Standard_True;
+Standard_Boolean CDF_Session::AddApplication(const Handle(CDF_Application)& theApp,
+  const Standard_ThreadId theID)
+{
+  return AddApplication(theApp.get(), theID);
 }
 
 //=======================================================================
-//function : UnsetCurrentApplication
-//purpose  : 
-//=======================================================================
-void CDF_Session::UnsetCurrentApplication() {
-  myHasCurrentApplication = Standard_False;
-  myCurrentApplication.Nullify();
+//function : AddApplication
+//purpose  : adds the application to the session with unique name
+//=======================================================================
+Standard_Boolean CDF_Session::AddApplication(const CDF_Application* theApp,
+  const Standard_ThreadId theID)
+{
+  Standard_Boolean aRetValue(Standard_False);
+  if (theApp)
+  {
+    Standard_Mutex::Sentry aLocker(THE_MUTEX);
+    if (!myAppDirectory.IsBound(theID))
+    {
+      Handle(CDF_Application) anApp(theApp);
+      aRetValue = myAppDirectory.Bind(theID, anApp);
+    }
+  }
+  return aRetValue;
 }
 
 //=======================================================================
-//function : MetaDataDriver
+//function : FindApplication
 //purpose  : 
 //=======================================================================
-Handle(CDF_MetaDataDriver) CDF_Session::MetaDataDriver() const {
-  Standard_NoSuchObject_Raise_if(myMetaDataDriver.IsNull(),"no metadatadriver has been provided; this session is not able to store or retrieve files.");
-  return myMetaDataDriver;
+Standard_Boolean CDF_Session::FindApplication(const Standard_ThreadId theID, Handle(CDF_Application)& theApp) const
+{
+  Standard_Mutex::Sentry aLocker(THE_MUTEX);
+  if (myAppDirectory.IsBound(theID))
+  {
+    theApp = Handle(CDF_Application)::DownCast (myAppDirectory.Find(theID));
+    return ! theApp.IsNull();
+  }
+  return Standard_False;
 }
-
 //=======================================================================
-//function : LoadDriver
-//purpose  : 
+//function : RemoveApplication
+//purpose  : removes the application with name=<theName> from the session
 //=======================================================================
-void CDF_Session::LoadDriver() {
-  if (myMetaDataDriver.IsNull()) {
-    // for compatibility with old code, initialize useless driver directly
-    // instead of loading it as plugin
-    Handle(CDF_MetaDataDriverFactory) aFactory;
-    myMetaDataDriver = new CDF_FWOSDriver;
+Standard_Boolean CDF_Session::RemoveApplication(const Standard_ThreadId theID)
+{
+  Standard_Boolean aRetValue(Standard_False);
+  Standard_Mutex::Sentry aLocker(THE_MUTEX);
+  if (myAppDirectory.IsBound(theID))
+  {
+    aRetValue = myAppDirectory.UnBind(theID);
   }
+  return aRetValue;
 }