16 _className(className) {
22 static const std::string routineName(
"GGSTClonesArrayService::~GGSTClonesArrayService");
23 if (_assignedArrays.size() != 0) {
24 COUT(WARNING) <<
"There are still " << _assignedArrays.size() <<
" currently assigned arrays for class "
25 << _className <<
"." <<
ENDL;
26 CCOUT(WARNING) <<
"These will not be deleted. The user routine must delete them." <<
ENDL;
27 for (ArrayList::iterator iArray = _assignedArrays.begin(); iArray != _assignedArrays.end(); iArray++) {
36 static const std::string routineName(
"GGSTClonesArrayService::ProvideArray");
40 for (ArrayList::iterator iArray = _availableArrays.begin(); iArray != _availableArrays.end(); iArray++) {
41 if (iArray->allocSize >= sizeHint) {
42 _assignedArrays.splice(_assignedArrays.end(), _availableArrays, iArray);
44 iArray->array->Clear(
"C");
47 iArray->array->Clear();
49 COUT(DEEPDEB) <<
"Assigned array at " << iArray->array <<
" for class " << _className <<
" with size " << sizeHint
55 if (_availableArrays.size() > 0) {
56 ArrayList::iterator lastAvailable = _availableArrays.end();
58 _assignedArrays.splice(_assignedArrays.end(), _availableArrays, lastAvailable);
60 _assignedArrays.back().array->Clear(
"C");
63 _assignedArrays.back().array->Clear();
65 COUT(DEEPDEB) <<
"Assigned array at " << _assignedArrays.back().array <<
" for class " << _className
66 <<
" with size " << sizeHint <<
ENDL;
67 return _assignedArrays.back().array;
70 _assignedArrays.push_back(ArrayDescriptor());
71 _assignedArrays.back().array =
new TClonesArray(_className.c_str(), sizeHint);
72 _assignedArrays.back().allocSize = sizeHint;
73 COUT(DEEPDEB) <<
"Created array at " << _assignedArrays.back().array <<
" for class " << _className <<
" with size "
75 return _assignedArrays.back().array;
82 static const std::string routineName(
"GGSTClonesArrayService::TakeBackArray");
84 int arraySize = array->GetEntries();
87 ArrayList::iterator iAvArray;
88 for (iAvArray = _availableArrays.begin(); iAvArray != _availableArrays.end(); iAvArray++) {
89 if (iAvArray->allocSize > arraySize) {
95 for (ArrayList::iterator iArray = _assignedArrays.begin(); iArray != _assignedArrays.end(); iArray++) {
96 if (array == iArray->array) {
97 _availableArrays.splice(iAvArray, _assignedArrays, iArray);
99 COUT(DEEPDEB) <<
"Took back array at " << iArray->array <<
" for class " << _className <<
" with size "
100 << arraySize <<
ENDL;
105 ArrayList::iterator newArray = _availableArrays.insert(iAvArray, ArrayDescriptor());
106 newArray->array = array;
107 newArray->allocSize = arraySize;
109 COUT(DEEPDEB) <<
"Adopted array at " << newArray->array <<
" for class " << _className <<
" with size " << arraySize
117 _availableArrays.resize(0);
122 void GGSTClonesArrayService::DumpMemInfo() {
123 const std::string routineName(
"GGSTClonesArrayService::DumpMemInfo");
124 COUT(DEBUG) <<
"Class: " << _className <<
", available: " << _availableArrays.size() <<
", assigned: "
125 << _assignedArrays.size() <<
ENDL;
127 size_t allocForAvaialble = 0;
128 for (
auto &arr : _availableArrays) {
129 nAvailable += arr.array->GetEntries();
130 allocForAvaialble += arr.array->GetSize();
133 size_t allocForAssigned = 0;
134 for (
auto &arr : _assignedArrays) {
135 nAssigned += arr.array->GetEntries();
136 allocForAssigned += arr.array->GetSize();
138 CCOUT(DEBUG) <<
"Available: nElemTot=" << nAvailable <<
", <nElem>="
139 << (float) nAvailable / (
float) _availableArrays.size() << ", allocated: " << allocForAvaialble <<
ENDL;
140 CCOUT(DEBUG) << "Assigned: nElemTot=" << nAssigned << ", <nElem>="
141 << (
float) nAssigned / (
float) _assignedArrays.size() << ", allocated: " << allocForAssigned << ENDL;
#define COUT(level)
Smart log macro. It writes on stdout only if the specified verbosity level is lesser than the maximum...
void DeleteAll()
Delete all unassigned arrays in storage.
#define CCOUT(level)
Smart log utility which prints no header at the beginning of the line.
TClonesArray * ProvideArray(int sizeHint=0, bool clearElements=false)
Method to obtain an array from the service.
void TakeBackArray(TClonesArray *&array)
Gives an array back to the service.
GGSTClonesArrayService(const char *className)
Constructor.
~GGSTClonesArrayService()
Destructor.