Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
G4GeometryWorkspacePool.cc
이 파일의 문서화 페이지로 가기
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 // $Id: G4GeometryWorkspacePool.cc 110271 2018-05-17 14:41:15Z gcosmo $
28 //
29 //
30 // Class G4GeometryWorkspacePool - implementation
31 //
32 // ----------------------------------------------------------------------
33 
35 #include "G4GeometryWorkspace.hh"
36 
37 #include "G4AutoLock.hh"
38 
39 namespace
40 {
41  G4Mutex singletonM = G4MUTEX_INITIALIZER;
42 }
43 
45 {
46  G4ThreadLocalStatic G4GeometryWorkspace* _instance = nullptr;
47  return _instance;
48 }
49 
51 
52 // ----------------------------------------------------------------------
53 //
55 {
56  G4AutoLock l(&singletonM);
57  if ( !thePool ) { thePool= new G4GeometryWorkspacePool(); }
58  return thePool;
59 }
60 
61 // ----------------------------------------------------------------------
62 // For use with MT and current G4WorkerThread -- which uses static methods
63 //
65 {
66  G4GeometryWorkspace* geometryWrk=0;
67  if( !fMyWorkspace() )
68  {
69  geometryWrk= new G4GeometryWorkspace();
70 
71  if( !geometryWrk )
72  {
73  G4Exception("GeometryWorspacePool::CreateWorkspace", "GeomVol003",
74  FatalException, "Failed to create workspace.");
75  }
76  else
77  {
78  fMyWorkspace()= geometryWrk;
79  }
80  }
81  else
82  {
83  G4Exception("GeometryWorspacePool::CreateWorkspace", "GeomVol003",
85  "Cannot create workspace twice for the same thread.");
86  geometryWrk= fMyWorkspace();
87  }
88 
89  return geometryWrk;
90 }
91 
92 // ----------------------------------------------------------------------
93 // Create it (as above) and use it
94 //
96 {
97  (this->CreateWorkspace())->UseWorkspace();
98 }
99 
100 // ----------------------------------------------------------------------
101 // Reuse an existing workspace - or create a new one if needed.
102 //
104 {
105  G4GeometryWorkspace* geometryWrk= fMyWorkspace();
106  if( !geometryWrk )
107  {
108  geometryWrk= this->CreateWorkspace();
109  }
110  geometryWrk->UseWorkspace();
111 
112  fMyWorkspace()= geometryWrk; // assign it for use by this thread.
113  return geometryWrk;
114 }
115 
116 // ----------------------------------------------------------------------
117 //
119 {
120  geometryWrk->ReleaseWorkspace();
121  // if( fWarehouse ){
122  // } else {
123  delete geometryWrk;
124  // }
125 }
126 
127 // ----------------------------------------------------------------------
128 //
130 {
131  if (fMyWorkspace())
132  {
134  delete fMyWorkspace();
135  fMyWorkspace()=0;
136  }
137 }
138 
139 // ----------------------------------------------------------------------
140 //
142 {
143  // fWarehouse=0;
144 }
145 
146 // ----------------------------------------------------------------------
147 //
149 {
150 }
G4GeometryWorkspace * CreateWorkspace()
static G4GEOM_DLL G4GeometryWorkspace *& fMyWorkspace()
void Recycle(G4GeometryWorkspace *)
#define G4ThreadLocalStatic
Definition: tls.hh:68
#define G4MUTEX_INITIALIZER
Definition: G4Threading.hh:88
G4GeometryWorkspace * FindOrCreateWorkspace()
static G4GeometryWorkspacePool * thePool
static G4GeometryWorkspacePool * GetInstance()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.hh:65
std::mutex G4Mutex
Definition: G4Threading.hh:84