Geant4-11
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
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