90 TObjectTable *gObjectTable;
93 ClassImp(TObjectTable);
98 TObjectTable::TObjectTable(Int_t tableSize)
100 fSize = (Int_t)TMath::NextPrime(tableSize);
101 fTable =
new TObject* [fSize];
102 memset(fTable, 0, fSize*
sizeof(TObject*));
109 TObjectTable::~TObjectTable()
111 delete [] fTable; fTable = 0;
119 void TObjectTable::Print(Option_t *option)
const
121 TString opt = option;
123 if (opt.Contains(
"all")) {
126 Printf(
"\nList of all objects");
127 Printf(
"object address class name");
128 Printf(
"================================================================================");
129 for (i = 0; i < fSize; i++) {
130 if (!fTable[i])
continue;
133 printf(
"%-8d 0x%-16lx %-24s %s\n", num, (Long_t)obj, obj->ClassName(),
136 Printf(
"================================================================================\n");
140 InstanceStatistics();
146 void TObjectTable::Add(TObject *op)
149 Error(
"Add",
"op is 0");
155 Int_t slot = FindElement(op);
156 if (fTable[slot] == 0) {
170 void TObjectTable::AddObj(TObject *op)
172 static Bool_t olock = kFALSE;
175 ::Error(
"TObjectTable::AddObj",
"op is 0");
183 gObjectTable =
new TObjectTable(10000);
185 gObjectTable->Add(gObjectTable);
188 gObjectTable->Add(op);
194 void TObjectTable::Delete(Option_t *)
196 for (
int i = 0; i < fSize; i++) {
208 void TObjectTable::Remove(TObject *op)
211 Error(
"Remove",
"remove 0 from TObjectTable");
218 Int_t i = FindElement(op);
219 if (fTable[i] == 0) {
220 Warning(
"Remove",
"0x%lx not found at %d", (Long_t)op, i);
221 for (
int j = 0; j < fSize; j++) {
222 if (fTable[j] == op) {
223 Error(
"Remove",
"0x%lx found at %d !!!", (Long_t)op, j);
242 void TObjectTable::RemoveQuietly(TObject *op)
249 Int_t i = FindElement(op);
251 for (
int j = 0; j < fSize; j++)
263 void TObjectTable::Terminate()
265 InstanceStatistics();
266 delete [] fTable; fTable = 0;
274 Int_t TObjectTable::FindElement(TObject *op)
283 slot = Int_t(TString::Hash(&op,
sizeof(TObject*)) % fSize);
284 for (n = 0; n < fSize; n++) {
285 if ((slotOp = fTable[slot]) == 0)
298 void TObjectTable::FixCollisions(Int_t index)
300 Int_t oldIndex, nextIndex;
303 for (oldIndex = index+1; ;oldIndex++) {
304 if (oldIndex >= fSize)
306 nextObject = fTable[oldIndex];
309 nextIndex = FindElement(nextObject);
310 if (nextIndex != oldIndex) {
311 fTable[nextIndex] = nextObject;
312 fTable[oldIndex] = 0;
320 void TObjectTable::Expand(Int_t newSize)
322 TObject **oldTable = fTable, *op;
324 newSize = (Int_t)TMath::NextPrime(newSize);
325 fTable =
new TObject* [newSize];
326 memset(fTable, 0, newSize*
sizeof(TObject*));
329 for (
int i = 0; i < oldsize; i++)
330 if ((op = oldTable[i]))
338 void TObjectTable::InstanceStatistics()
const
340 int n, h, s, ncum = 0, hcum = 0, scum = 0, tcum = 0, thcum = 0;
342 if (fTally == 0 || !fTable)
347 Printf(
"\nObject statistics");
348 Printf(
"class cnt on heap size total size heap size");
349 Printf(
"================================================================================");
350 TIter next(gROOT->GetListOfClasses());
352 while ((cl = (TClass*) next())) {
353 n = cl->GetInstanceCount();
354 h = cl->GetHeapInstanceCount();
357 Printf(
"%-24s %8d%11d%9d%14d%13d", cl->GetName(), n, h, s, n*s, h*s);
365 Printf(
"--------------------------------------------------------------------------------");
366 Printf(
"Total: %8d%11d%9d%14d%13d", ncum, hcum, scum, tcum, thcum);
367 Printf(
"================================================================================\n");
373 void TObjectTable::UpdateInstCount()
const
377 if (!fTable || !TROOT::Initialized())
380 gROOT->GetListOfClasses()->R__FOR_EACH(TClass,ResetInstanceCount)();
382 for (
int i = 0; i < fSize; i++)
383 if ((op = fTable[i])) {
384 if (op->TestBit(TObject::kNotDeleted))
385 op->IsA()->AddInstance(op->IsOnHeap());
387 Error(
"UpdateInstCount",
"oops 0x%lx\n", (Long_t)op);
395 void *TObjectTable::CheckPtrAndWarn(
const char *msg,
void *vp)
397 if (fTable && vp && fTable[FindElement((TObject*)vp)]) {
398 Remove((TObject*)vp);
399 Warning(
"CheckPtrAndWarn",
"%s (0x%lx)\n", msg, (Long_t)vp);