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:
@@ -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;
|
||||
}
|
||||
|
||||
//=======================================================================
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
@@ -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()) {
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user