1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

0031785: [REGRESSION] Application Framework - application crashes on reading XBF document in background thread

Class CDF_Session is removed.

Integrated previously but not described:

0029195: OCAF - ensure thread safety for different documents.

Static local variables are eliminated in PCDM package.
Global documents metadata look-up table and directory of opened documents are removed.
Look-up table is maintained now as field in instances of the CDM_Application class.
Methods providing iteration by components are removed from class CDF_Store; signature of methods returned Standard_ExtString is changed to return Handle(TCollection_HExtendedString).
Support of different "Presentations" of documents is eliminated.
This commit is contained in:
abv
2020-09-22 15:24:54 +03:00
committed by bugmaster
parent 0e57793fc6
commit 8a39adb7d8
33 changed files with 230 additions and 479 deletions

View File

@@ -137,9 +137,9 @@ TCollection_AsciiString CDM_Application::Version() const
//function : MetaDataLookUpTable
//purpose : returns the MetaData LookUpTable
//=======================================================================
CDM_MetaDataLookUpTable* CDM_Application::MetaDataLookUpTable()
CDM_MetaDataLookUpTable& CDM_Application::MetaDataLookUpTable()
{
return &myMetaDataLookUpTable;
return myMetaDataLookUpTable;
}
//=======================================================================

View File

@@ -70,7 +70,7 @@ public:
Standard_EXPORT virtual TCollection_AsciiString Version() const;
//! Returns MetaData LookUpTable
Standard_EXPORT virtual CDM_MetaDataLookUpTable* MetaDataLookUpTable();
Standard_EXPORT virtual CDM_MetaDataLookUpTable& MetaDataLookUpTable();
//! Dumps the content of me into the stream
Standard_EXPORT void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const;

View File

@@ -1,30 +0,0 @@
// Created on: 1997-05-06
// Created by: Jean-Louis Frenkel, Remi Lequette
// Copyright (c) 1997-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#ifndef CDM_ApplicationDirectory_HeaderFile
#define CDM_ApplicationDirectory_HeaderFile
#include <CDM_Application.hxx>
#include <TColStd_MapIntegerHasher.hxx>
#include <NCollection_DataMap.hxx>
#include <Standard_ThreadId.hxx>
#include <NCollection_DefaultHasher.hxx>
typedef NCollection_DefaultHasher<Standard_ThreadId> CDM_MapThreadIDHasher;
typedef NCollection_DataMap<Standard_ThreadId,Handle(CDM_Application),CDM_MapThreadIDHasher> CDM_ApplicationDirectory;
typedef NCollection_DataMap<Standard_ThreadId,Handle(CDM_Application),CDM_MapThreadIDHasher>::Iterator CDM_DataMapIteratorOfApplicationDirectory;
#endif

View File

@@ -536,8 +536,8 @@ void CDM_Document::SetMetaData(const Handle(CDM_MetaData)& aMetaData)
aMetaData->SetDocument(this);
// Update the document refencing this MetaData:
CDM_DataMapIteratorOfMetaDataLookUpTable it(*CDM_MetaData::LookUpTable());
// Update the document refencing this MetaData:
CDM_DataMapIteratorOfMetaDataLookUpTable it(Application()->MetaDataLookUpTable());
for(;it.More();it.Next()) {
const Handle(CDM_MetaData)& theMetaData=it.Value();
if(theMetaData != aMetaData && theMetaData->IsRetrieved()) {

View File

@@ -20,10 +20,9 @@
#include <CDM_MetaData.hxx>
#include <CDM_MetaDataLookUpTable.hxx>
#include <CDM_Reference.hxx>
#include <CDF_Session.hxx>
#include <Standard_Dump.hxx>
#include <CDF_Application.hxx>
#include <Standard_NoSuchObject.hxx>
#include <Standard_NullObject.hxx>
#include <Standard_Type.hxx>
#include <TCollection_ExtendedString.hxx>
#include <OSD_Thread.hxx>
@@ -70,33 +69,48 @@ void CDM_MetaData::SetDocument(const Handle(CDM_Document)& aDocument) {
void CDM_MetaData::UnsetDocument() {
myIsRetrieved = Standard_False;
}
Handle(CDM_MetaData) CDM_MetaData::LookUp(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath,const TCollection_ExtendedString& aFileName,const Standard_Boolean ReadOnly) {
Handle(CDM_MetaData) CDM_MetaData::LookUp(CDM_MetaDataLookUpTable& theLookUpTable,
const TCollection_ExtendedString& aFolder,
const TCollection_ExtendedString& aName,
const TCollection_ExtendedString& aPath,
const TCollection_ExtendedString& aFileName,
const Standard_Boolean ReadOnly)
{
Handle(CDM_MetaData) theMetaData;
TCollection_ExtendedString aConventionalPath=aPath;
aConventionalPath.ChangeAll('\\','/');
CDM_MetaDataLookUpTable* aLookUpTable = LookUpTable();
if (!aLookUpTable) return theMetaData;
if(!aLookUpTable->IsBound(aConventionalPath)) {
if(!theLookUpTable.IsBound(aConventionalPath))
{
theMetaData = new CDM_MetaData(aFolder,aName,aPath,aFileName,ReadOnly);
aLookUpTable->Bind(aConventionalPath, theMetaData);
theLookUpTable.Bind(aConventionalPath, theMetaData);
}
else
theMetaData = aLookUpTable->Find(aConventionalPath);
{
theMetaData = theLookUpTable.Find(aConventionalPath);
}
return theMetaData;
}
Handle(CDM_MetaData) CDM_MetaData::LookUp(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath, const TCollection_ExtendedString& aVersion, const TCollection_ExtendedString& aFileName,const Standard_Boolean ReadOnly) {
Handle(CDM_MetaData) CDM_MetaData::LookUp(CDM_MetaDataLookUpTable& theLookUpTable,
const TCollection_ExtendedString& aFolder,
const TCollection_ExtendedString& aName,
const TCollection_ExtendedString& aPath,
const TCollection_ExtendedString& aVersion,
const TCollection_ExtendedString& aFileName,
const Standard_Boolean ReadOnly)
{
Handle(CDM_MetaData) theMetaData;
TCollection_ExtendedString aConventionalPath=aPath;
aConventionalPath.ChangeAll('\\','/');
CDM_MetaDataLookUpTable* aLookUpTable = LookUpTable();
if (!aLookUpTable) return theMetaData;
if(!aLookUpTable->IsBound(aConventionalPath)) {
if(!theLookUpTable.IsBound(aConventionalPath))
{
theMetaData = new CDM_MetaData(aFolder,aName,aPath,aVersion,aFileName,ReadOnly);
aLookUpTable->Bind(aConventionalPath,theMetaData);
theLookUpTable.Bind(aConventionalPath,theMetaData);
}
else
theMetaData = aLookUpTable->Find(aConventionalPath);
{
theMetaData = theLookUpTable.Find(aConventionalPath);
}
return theMetaData;
}
@@ -134,14 +148,6 @@ Standard_OStream& CDM_MetaData::operator << (Standard_OStream& anOStream) {
return Print(anOStream);
}
CDM_MetaDataLookUpTable* CDM_MetaData::LookUpTable() {
Handle(CDF_Session) aSession = CDF_Session::Create();
Handle(CDF_Application) anApp;
CDM_MetaDataLookUpTable* pLookUpTable(NULL);
if (aSession->FindApplication(OSD_Thread::Current(), anApp))
return anApp->MetaDataLookUpTable();
return pLookUpTable;
}
Standard_Integer CDM_MetaData::DocumentVersion(const Handle(CDM_Application)& anApplication) {
if(myDocumentVersion==0) myDocumentVersion=anApplication->DocumentVersion(this);
return myDocumentVersion;

View File

@@ -45,11 +45,21 @@ class CDM_MetaData : public Standard_Transient
public:
Standard_EXPORT static Handle(CDM_MetaData) LookUp (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath, const TCollection_ExtendedString& aFileName, const Standard_Boolean ReadOnly);
Standard_EXPORT static Handle(CDM_MetaData) LookUp (const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath, const TCollection_ExtendedString& aVersion, const TCollection_ExtendedString& aFileName, const Standard_Boolean ReadOnly);
Standard_EXPORT static Handle(CDM_MetaData) LookUp (CDM_MetaDataLookUpTable& theLookUpTable,
const TCollection_ExtendedString& aFolder,
const TCollection_ExtendedString& aName,
const TCollection_ExtendedString& aPath,
const TCollection_ExtendedString& aFileName,
const Standard_Boolean ReadOnly);
Standard_EXPORT static Handle(CDM_MetaData) LookUp (CDM_MetaDataLookUpTable& theLookUpTable,
const TCollection_ExtendedString& aFolder,
const TCollection_ExtendedString& aName,
const TCollection_ExtendedString& aPath,
const TCollection_ExtendedString& aVersion,
const TCollection_ExtendedString& aFileName,
const Standard_Boolean ReadOnly);
Standard_EXPORT Standard_Boolean IsRetrieved() const;
Standard_EXPORT Handle(CDM_Document) Document() const;
@@ -101,23 +111,26 @@ friend
DEFINE_STANDARD_RTTIEXT(CDM_MetaData,Standard_Transient)
protected:
private:
Standard_EXPORT CDM_MetaData(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath, const TCollection_ExtendedString& aFileName, const Standard_Boolean ReadOnly);
Standard_EXPORT CDM_MetaData(const TCollection_ExtendedString& aFolder, const TCollection_ExtendedString& aName, const TCollection_ExtendedString& aPath, const TCollection_ExtendedString& aVersion, const TCollection_ExtendedString& aFileName, const Standard_Boolean ReadOnly);
Standard_EXPORT void SetDocument (const Handle(CDM_Document)& aDocument);
Standard_EXPORT static CDM_MetaDataLookUpTable* LookUpTable();
Standard_EXPORT Standard_Integer DocumentVersion (const Handle(CDM_Application)& anApplication);
CDM_MetaData (const TCollection_ExtendedString& aFolder,
const TCollection_ExtendedString& aName,
const TCollection_ExtendedString& aPath,
const TCollection_ExtendedString& aFileName,
const Standard_Boolean ReadOnly);
CDM_MetaData (const TCollection_ExtendedString& aFolder,
const TCollection_ExtendedString& aName,
const TCollection_ExtendedString& aPath,
const TCollection_ExtendedString& aVersion,
const TCollection_ExtendedString& aFileName,
const Standard_Boolean ReadOnly);
void SetDocument (const Handle(CDM_Document)& aDocument);
Standard_Integer DocumentVersion (const Handle(CDM_Application)& anApplication);
private:
Standard_Boolean myIsRetrieved;
CDM_DocumentPointer myDocument;

View File

@@ -16,7 +16,6 @@ CDM_MetaData.cxx
CDM_MetaData.hxx
CDM_MetaDataLookUpTable.hxx
CDM_NamesDirectory.hxx
CDM_ApplicationDirectory.hxx
CDM_Reference.cxx
CDM_Reference.hxx
CDM_ReferenceIterator.cxx