Skip to content
Snippets Groups Projects
Commit 9aa86d38 authored by Rene Brun's avatar Rene Brun
Browse files

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
parent 627dc4d1
No related merge requests found
// @(#)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 // Author: Rene Brun 28/09/2001
/************************************************************************* /*************************************************************************
...@@ -34,12 +34,15 @@ class TFile; ...@@ -34,12 +34,15 @@ class TFile;
class TProcessID : public TNamed { class TProcessID : public TNamed {
protected: protected:
Int_t fCount; //!Reference count to this object (from TFile) Int_t fCount; //!Reference count to this object (from TFile)
TObjArray *fObjects; //!Array pointing to the referenced objects 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();
TProcessID(UShort_t pid);
TProcessID(const TProcessID &ref); TProcessID(const TProcessID &ref);
virtual ~TProcessID(); virtual ~TProcessID();
Int_t DecrementCount(); Int_t DecrementCount();
...@@ -50,8 +53,15 @@ public: ...@@ -50,8 +53,15 @@ public:
void PutObjectWithID(TObject *obj, UInt_t uid=0); void PutObjectWithID(TObject *obj, UInt_t uid=0);
virtual void RecursiveRemove(TObject *obj); 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 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 ClassDef(TProcessID,1) //Process Unique Identifier in time and space
}; };
......
// @(#)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 // Author: Rene Brun 28/09/2001
/************************************************************************* /*************************************************************************
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
// When a referenced object is read from a file (its bit kIsReferenced is set), // 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. // this object is entered into the objects table of the corresponding TProcessID.
// Each TFile has a list of TProcessIDs (see TFile::fProcessIDs) also // 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 // When this object is deleted, it is removed from the table via the cleanup
// mechanism invoked by the TObject destructor. // mechanism invoked by the TObject destructor.
// //
...@@ -48,9 +48,12 @@ ...@@ -48,9 +48,12 @@
#include "TProcessID.h" #include "TProcessID.h"
#include "TROOT.h" #include "TROOT.h"
#include "TFile.h" #include "TFile.h"
#include "TSystem.h"
#include "TUUID.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) ClassImp(TProcessID)
...@@ -59,35 +62,71 @@ TProcessID::TProcessID() ...@@ -59,35 +62,71 @@ TProcessID::TProcessID()
{ {
fCount = 0; fCount = 0;
fObjects = 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]; char name[20];
sprintf(name,"ProcessID%d",pid); sprintf(name,"ProcessID%d",apid);
SetName(name); pid->SetName(name);
TUUID u; TUUID u;
SetTitle(u.AsString()); pid->SetTitle(u.AsString());
fObjects = 0; return pid;
fCount = 0;
gROOT->GetListOfCleanups()->Add(this);
} }
//______________________________________________________________________________ //______________________________________________________________________________
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; UInt_t uid = obj->GetUniqueID();
fObjects = 0; if (obj == fgPID->GetObjectWithID(uid)) return uid;
gROOT->GetListOfProcessIDs()->Remove(this); fgNumber++;
gROOT->GetListOfCleanups()->Remove(this); 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() ...@@ -96,11 +135,20 @@ Int_t TProcessID::DecrementCount()
// the reference fCount is used to delete the TProcessID // the reference fCount is used to delete the TProcessID
// in the TFile destructor when fCount = 0 // in the TFile destructor when fCount = 0
fCount--; fCount--;
if (fCount < 0) fCount = 0; if (fCount < 0) fCount = 0;
return fCount; 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() Int_t TProcessID::IncrementCount()
{ {
...@@ -109,11 +157,21 @@ Int_t TProcessID::IncrementCount() ...@@ -109,11 +157,21 @@ Int_t TProcessID::IncrementCount()
fCount++; fCount++;
return 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) TObject *TProcessID::GetObjectWithID(UInt_t uid)
{ {
//returns the TObject with unique identifier uid in the table of objects //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; if ((Int_t)uid > fObjects->GetSize()) return 0;
return fObjects->UncheckedAt(uid); return fObjects->UncheckedAt(uid);
} }
...@@ -124,6 +182,7 @@ void TProcessID::PutObjectWithID(TObject *obj, UInt_t 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 //stores the object at the uid th slot in the table of objects
//The object uniqueid is set as well as its kMustCleanup bit //The object uniqueid is set as well as its kMustCleanup bit
//if (!fObjects) fObjects = new TObjArray(100);
if (uid == 0) uid = obj->GetUniqueID(); if (uid == 0) uid = obj->GetUniqueID();
fObjects->AddAtAndExpand(obj,uid); fObjects->AddAtAndExpand(obj,uid);
obj->SetBit(kMustCleanup); obj->SetBit(kMustCleanup);
...@@ -148,19 +207,18 @@ TProcessID *TProcessID::ReadProcessID(UShort_t pidf, TFile *file) ...@@ -148,19 +207,18 @@ TProcessID *TProcessID::ReadProcessID(UShort_t pidf, TFile *file)
sprintf(pidname,"ProcessID%d",pidf); sprintf(pidname,"ProcessID%d",pidf);
pid = (TProcessID *)file->Get(pidname); pid = (TProcessID *)file->Get(pidname);
if (!pid) { 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; return 0;
} }
//check that a similar pid is not already registered in gROOT pids->AddAtAndExpand(pid,pidf);
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);
pid->IncrementCount(); 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; return pid;
} }
...@@ -174,3 +232,35 @@ void TProcessID::RecursiveRemove(TObject *obj) ...@@ -174,3 +232,35 @@ void TProcessID::RecursiveRemove(TObject *obj)
UInt_t uid = obj->GetUniqueID(); UInt_t uid = obj->GetUniqueID();
if (obj == GetObjectWithID(uid)) fObjects->RemoveAt(uid); 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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment