From 9aa86d386fb7ab95c7f7549c1d6c90b7db0f5d9c Mon Sep 17 00:00:00 2001 From: Rene Brun <Rene.Brun@cern.ch> Date: Sun, 2 Dec 2001 15:11:32 +0000 Subject: [PATCH] Many functions previously in TRef moved to TProcessID. The first time a referenced or referencing object is written to a file, the corresponding TProcessID is also written. The ObjectCounter fgNumber also moved to TProcessID. git-svn-id: http://root.cern.ch/svn/root/trunk@3346 27541ba8-7e3a-0410-8455-c3a389f83636 --- base/inc/TProcessID.h | 22 ++++-- base/src/TProcessID.cxx | 146 ++++++++++++++++++++++++++++++++-------- 2 files changed, 134 insertions(+), 34 deletions(-) diff --git a/base/inc/TProcessID.h b/base/inc/TProcessID.h index 30e04c49ad6..0772771db53 100644 --- a/base/inc/TProcessID.h +++ b/base/inc/TProcessID.h @@ -1,4 +1,4 @@ -// @(#)root/cont:$Name: $:$Id: TProcessID.h,v 1.1 2001/10/01 10:29:08 brun Exp $ +// @(#)root/cont:$Name: $:$Id: TProcessID.h,v 1.2 2001/11/28 14:47:03 brun Exp $ // Author: Rene Brun 28/09/2001 /************************************************************************* @@ -34,12 +34,15 @@ class TFile; class TProcessID : public TNamed { protected: - Int_t fCount; //!Reference count to this object (from TFile) - TObjArray *fObjects; //!Array pointing to the referenced objects + Int_t fCount; //!Reference count to this object (from TFile) + TObjArray *fObjects; //!Array pointing to the referenced objects -public: + static TProcessID *fgPID; //Pointer to current session ProcessID + static TObjArray *fgPIDs; //Table of ProcessIDs + static UInt_t fgNumber; //Referenced objects count + + public: TProcessID(); - TProcessID(UShort_t pid); TProcessID(const TProcessID &ref); virtual ~TProcessID(); Int_t DecrementCount(); @@ -50,8 +53,15 @@ public: void PutObjectWithID(TObject *obj, UInt_t uid=0); virtual void RecursiveRemove(TObject *obj); + static TProcessID *AddProcessID(); + static UInt_t AssignID(TObject *obj); + static void Cleanup(); static TProcessID *ReadProcessID(UShort_t pidf , TFile *file); - + static UShort_t WriteProcessID(TProcessID *pid , TFile *file); + static TProcessID *GetProcessID(UShort_t pid); + static UInt_t GetObjectCount(); + static void SetObjectCount(UInt_t number); + ClassDef(TProcessID,1) //Process Unique Identifier in time and space }; diff --git a/base/src/TProcessID.cxx b/base/src/TProcessID.cxx index 449617c2137..201cf0584a6 100644 --- a/base/src/TProcessID.cxx +++ b/base/src/TProcessID.cxx @@ -1,4 +1,4 @@ -// @(#)root/cont:$Name: $:$Id: TProcessID.cxx,v 1.6 2001/11/20 09:32:54 brun Exp $ +// @(#)root/cont:$Name: $:$Id: TProcessID.cxx,v 1.7 2001/11/28 14:47:03 brun Exp $ // Author: Rene Brun 28/09/2001 /************************************************************************* @@ -30,7 +30,7 @@ // When a referenced object is read from a file (its bit kIsReferenced is set), // this object is entered into the objects table of the corresponding TProcessID. // Each TFile has a list of TProcessIDs (see TFile::fProcessIDs) also -// accessible via gROOT->GetListOfProcessIDs() (for all files). +// accessible via TProcessID::fgPIDs (for all files). // When this object is deleted, it is removed from the table via the cleanup // mechanism invoked by the TObject destructor. // @@ -48,9 +48,12 @@ #include "TProcessID.h" #include "TROOT.h" #include "TFile.h" -#include "TSystem.h" #include "TUUID.h" +TObjArray *TProcessID::fgPIDs = 0; //pointer to the list of TProcessID +TProcessID *TProcessID::fgPID = 0; //pointer to the TProcessID of the current session +UInt_t TProcessID::fgNumber = 0; //Current referenced object instance count + ClassImp(TProcessID) @@ -59,35 +62,71 @@ TProcessID::TProcessID() { fCount = 0; fObjects = 0; - gROOT->GetListOfCleanups()->Add(this); } //______________________________________________________________________________ -TProcessID::TProcessID(UShort_t pid) +TProcessID::~TProcessID() +{ + + delete fObjects; + fObjects = 0; + fgPIDs->Remove(this); +} + +//______________________________________________________________________________ +TProcessID::TProcessID(const TProcessID &ref) +{ + // TProcessID copy ctor. +} + +//______________________________________________________________________________ +TProcessID *TProcessID::AddProcessID() { +// static function to add a new TProcessID to the list of PIDs + + TProcessID *pid = new TProcessID(); + + if (!fgPIDs) { + fgPID = pid; + fgPIDs = new TObjArray(10); + gROOT->GetListOfCleanups()->Add(fgPIDs); + } + UShort_t apid = fgPIDs->GetEntriesFast(); + pid->IncrementCount(); + + fgPIDs->Add(pid); char name[20]; - sprintf(name,"ProcessID%d",pid); - SetName(name); + sprintf(name,"ProcessID%d",apid); + pid->SetName(name); TUUID u; - SetTitle(u.AsString()); - fObjects = 0; - fCount = 0; - gROOT->GetListOfCleanups()->Add(this); + pid->SetTitle(u.AsString()); + return pid; } //______________________________________________________________________________ -TProcessID::~TProcessID() +UInt_t TProcessID::AssignID(TObject *obj) { +// static function returning the ID assigned to obj +// If the object is not yet referenced, its kIsReferenced bit is set +// and its fUniqueID set to the current number of referenced objects so far. - delete fObjects; - fObjects = 0; - gROOT->GetListOfProcessIDs()->Remove(this); - gROOT->GetListOfCleanups()->Remove(this); + UInt_t uid = obj->GetUniqueID(); + if (obj == fgPID->GetObjectWithID(uid)) return uid; + fgNumber++; + obj->SetBit(kIsReferenced); + uid = fgNumber; + obj->SetUniqueID(uid); + fgPID->PutObjectWithID(obj,uid); + return uid; } + //______________________________________________________________________________ -TProcessID::TProcessID(const TProcessID &ref) +void TProcessID::Cleanup() { - // TProcessID copy ctor. + // static function (called by TROOT destructor) to delete all TProcessIDs + + fgPIDs->Delete(); + delete fgPIDs; } //______________________________________________________________________________ @@ -96,11 +135,20 @@ Int_t TProcessID::DecrementCount() // the reference fCount is used to delete the TProcessID // in the TFile destructor when fCount = 0 + fCount--; if (fCount < 0) fCount = 0; return fCount; } +//______________________________________________________________________________ +TProcessID *TProcessID::GetProcessID(UShort_t pid) +{ +// static function returning a pointer to TProcessID number pid in fgPIDs + + return (TProcessID*)fgPIDs->At(pid); +} + //______________________________________________________________________________ Int_t TProcessID::IncrementCount() { @@ -109,11 +157,21 @@ Int_t TProcessID::IncrementCount() fCount++; return fCount; } + +//______________________________________________________________________________ +UInt_t TProcessID::GetObjectCount() +{ +// Return the current referenced object count +// fgNumber is incremented everytime a new object is referenced + + return fgNumber; +} //______________________________________________________________________________ TObject *TProcessID::GetObjectWithID(UInt_t uid) { //returns the TObject with unique identifier uid in the table of objects + //if (!fObjects) fObjects = new TObjArray(100); if ((Int_t)uid > fObjects->GetSize()) return 0; return fObjects->UncheckedAt(uid); } @@ -124,6 +182,7 @@ void TProcessID::PutObjectWithID(TObject *obj, UInt_t uid) //stores the object at the uid th slot in the table of objects //The object uniqueid is set as well as its kMustCleanup bit + //if (!fObjects) fObjects = new TObjArray(100); if (uid == 0) uid = obj->GetUniqueID(); fObjects->AddAtAndExpand(obj,uid); obj->SetBit(kMustCleanup); @@ -148,19 +207,18 @@ TProcessID *TProcessID::ReadProcessID(UShort_t pidf, TFile *file) sprintf(pidname,"ProcessID%d",pidf); pid = (TProcessID *)file->Get(pidname); if (!pid) { - file->Error("ReadProcessID","Cannot find %s in file %s",pidname,file->GetName()); + //file->Error("ReadProcessID","Cannot find %s in file %s",pidname,file->GetName()); return 0; } - //check that a similar pid is not already registered in gROOT - TIter next(gROOT->GetListOfProcessIDs()); - TProcessID *apid; - while ((apid=(TProcessID *)next())) { - if (strcmp(apid->GetTitle(),pid->GetTitle())) continue; - gROOT->GetListOfProcessIDs()->Add(pid); - break; - } - pids->AddAt(pid,pidf); + pids->AddAtAndExpand(pid,pidf); pid->IncrementCount(); + //check that a similar pid is not already registered in fgPIDs + Int_t apid = fgPIDs->IndexOf(pid); + if (apid < 0) { + apid = fgPIDs->GetEntriesFast(); + fgPIDs->Add(pid); + pid->SetUniqueID(apid); + } return pid; } @@ -174,3 +232,35 @@ void TProcessID::RecursiveRemove(TObject *obj) UInt_t uid = obj->GetUniqueID(); if (obj == GetObjectWithID(uid)) fObjects->RemoveAt(uid); } + + +//______________________________________________________________________________ +void TProcessID::SetObjectCount(UInt_t number) +{ +// static function to set the current referenced object count +// fgNumber is incremented everytime a new object is referenced + + fgNumber = number; +} + +//______________________________________________________________________________ +UShort_t TProcessID::WriteProcessID(TProcessID *pid, TFile *file) +{ +// static function +// Check if the ProcessID pid is already in the file. +// if not, add it and return the index number in the local file list + + if (!file) return 0; + TObjArray *pids = file->GetListOfProcessIDs(); + Int_t pidf = 0; + if (pid) pidf = pids->IndexOf(pid); + if (pidf < 0) { + file->SetBit(TFile::kHasReferences); + pidf = (UShort_t)pids->GetEntriesFast(); + pids->Add(pid); + char name[32]; + sprintf(name,"ProcessID%d",pidf); + pid->Write(name); + } + return (UShort_t)pidf; +} -- GitLab