ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4PDefManager.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4PDefManager.hh
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 //
28 //
29 // ------------------------------------------------------------
30 //
31 // GEANT 4 class header file
32 //
33 // ---------------- G4PDefManager ----------------
34 //
35 // Utility template class for splitting RW data for thread-safety from
36 // classes: G4ParticleDefinition, G4VDecayChannel.
37 //
38 // ------------------------------------------------------------
39 // History:
40 // 01.25.2009 Xin Dong: First implementation from automatic MT conversion.
41 // ------------------------------------------------------------
42 #ifndef G4PDefManager_HH
43 #define G4PDefManager_HH
44 
45 #include <stdlib.h>
46 
47 #include "globals.hh"
48 #include "pwdefs.hh"
49 #include "G4AutoLock.hh"
50 
51 class G4ProcessManager;
52 
53 // G4PDefData is the private data from the object to be split
55 {
56  // Encapsulates the fields of the class G4ParticleDefinition
57  // that may not be read-only.
58 
59  public:
60 
61  void initialize();
62 
64 };
65 
66 // The type G4PDefManager is introduced to encapsulate the methods used by
67 // both the master thread and worker threads to allocate memory space for
68 // the fields encapsulated by the class G4PDefData. When each thread
69 // changes the value for these fields, it refers to them using a macro
70 // definition defined below. For every G4ParticleDefinition instance,
71 // there is a corresponding G4PDefData instance. All G4PDefData instances
72 // are organized by the class G4PDefManager as an array.
73 // The field "int g4particleDefinitionInstanceID" is added to the class G4ParticleDefinition.
74 // The value of this field in each G4ParticleDefinition instance is the
75 // subscript of the corresponding G4PDefData instance.
76 // In order to use the class G4PDefManager, we add a static member in the class
77 // G4ParticleDefinition as follows: "static G4PDefManager subInstanceManager".
78 // Both the master thread and worker threads change the length of the array
79 // for G4PDefData instances mutually along with G4ParticleDefinition
80 // instances are created. For each worker thread, it dynamically creates ions.
81 // Consider any thread A, if there is any other thread which creates an ion.
82 // This ion is shared by the thread A. So the thread A leaves an empty space
83 // in the array of G4PDefData instances for the ion.
84 //
85 
87 {
88  public:
89 
90  G4PDefManager();
92  // Invoked by the master or work thread to create a new subinstance
93  // whenever a new split class instance is created. For each worker
94  // thread, ions are created dynamically.
95 
96 
97  void NewSubInstances();
98  // Invoked by each worker thread to grow the subinstance array and
99  // initialize each new subinstance using a particular method defined
100  // by the subclass.
101 
102  void FreeSlave();
103  // Invoked by all threads to free the subinstance array.
104 
106 
107  void UseWorkArea( G4PDefData* newOffset ); // , G4int numObjects, G4int numSpace)
108 
109  G4PDefData* FreeWorkArea(); // G4int* numObjects, G4int* numSpace)
110 
111  public:
112 
113  G4PART_DLL static G4int& slavetotalspace(); // thread-local
114  G4PART_DLL static G4PDefData*& offset(); // thread-local
115 
116  private:
117 
120 };
121 
122 #endif