Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4PDefManager.hh
Go to the documentation of this file.
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// G4PDefManager
27//
28// Class description:
29//
30// Utility template class for splitting read/write data for
31// thread-safety from classes: G4ParticleDefinition, G4VDecayChannel.
32//
33// The type G4PDefManager is introduced to encapsulate the methods used by
34// both the master thread and worker threads to allocate memory space for
35// the fields encapsulated by the class G4PDefData. When each thread
36// changes the value for these fields, it refers to them using a macro
37// definition defined below. For every G4ParticleDefinition instance,
38// there is a corresponding G4PDefData instance. All G4PDefData instances
39// are organized by the class G4PDefManager as an array.
40// The field "int g4particleDefinitionInstanceID" is added to the class
41// G4ParticleDefinition.
42// The value of this field in each G4ParticleDefinition instance is the
43// subscript of the corresponding G4PDefData instance.
44// In order to use the class G4PDefManager, we add a static member in the
45// class G4ParticleDefinition as follows:
46// "static G4PDefManager subInstanceManager".
47// Both the master thread and worker threads change the length of the array
48// for G4PDefData instances mutually along with G4ParticleDefinition
49// instances are created. For each worker thread, it dynamically creates ions.
50// Consider any thread A, if there is any other thread which creates an ion.
51// This ion is shared by the thread A. So the thread A leaves an empty space
52// in the array of G4PDefData instances for the ion.
53
54// Author: Xin Dong, 25.01.2009 - First implementation
55// from automatic MT conversion
56// --------------------------------------------------------------------
57#ifndef G4PDefManager_hh
58#define G4PDefManager_hh
59
60#include <stdlib.h>
61
62#include "globals.hh"
63#include "pwdefs.hh"
64#include "G4AutoLock.hh"
65
68
70{
71 // G4PDefData is the private data from the object to be split.
72 // Encapsulates the fields of the class G4ParticleDefinition
73 // that may not be read-only.
74
75 public:
76
77 void initialize();
78
81};
82
84{
85 public:
86
89 // Invoked by the master or work thread to create a new subinstance
90 // whenever a new split class instance is created. For each worker
91 // thread, ions are created dynamically.
92
93
94 void NewSubInstances();
95 // Invoked by each worker thread to grow the subinstance array and
96 // initialize each new subinstance using a particular method defined
97 // by the subclass.
98
99 void FreeSlave();
100 // Invoked by all threads to free the subinstance array.
101
103
104 void UseWorkArea( G4PDefData* newOffset );
105
107
108 G4PART_DLL static G4int& slavetotalspace(); // thread-local
109 G4PART_DLL static G4PDefData*& offset(); // thread-local
110
111 private:
112
113 G4int totalobj;
115};
116
117#endif
std::mutex G4Mutex
Definition: G4Threading.hh:81
int G4int
Definition: G4Types.hh:85
void initialize()
G4VTrackingManager * theTrackingManager
G4ProcessManager * theProcessManager
G4int CreateSubInstance()
G4PDefData * FreeWorkArea()
static G4PART_DLL G4int & slavetotalspace()
static G4PART_DLL G4PDefData *& offset()
void UseWorkArea(G4PDefData *newOffset)
G4PDefData * GetOffset()
void NewSubInstances()
#define G4PART_DLL
Definition: pwdefs.hh:45