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