From 0539d73e1f4101b849cfe51025defcfcbfd5b70d Mon Sep 17 00:00:00 2001
From: Philippe Canal <pcanal@fnal.gov>
Date: Thu, 20 Mar 2008 22:04:03 +0000
Subject: [PATCH] Remove unnecessary change of the current ROOT directory and
 reduce the span of those that are still compulsory (hence aiding
 threadsafety)

git-svn-id: http://root.cern.ch/svn/root/trunk@22805 27541ba8-7e3a-0410-8455-c3a389f83636
---
 tree/src/TBasket.cxx        |  2 --
 tree/src/TBranch.cxx        |  8 +++++---
 tree/src/TBranchElement.cxx |  3 +--
 tree/src/TBranchObject.cxx  |  3 +--
 tree/src/TChain.cxx         | 21 ++++++++++++++-------
 tree/src/TFriendElement.cxx |  2 +-
 tree/src/TTree.cxx          | 12 +++++-------
 7 files changed, 27 insertions(+), 24 deletions(-)

diff --git a/tree/src/TBasket.cxx b/tree/src/TBasket.cxx
index b26c9166d27..e7bad9ea9a0 100644
--- a/tree/src/TBasket.cxx
+++ b/tree/src/TBasket.cxx
@@ -265,8 +265,6 @@ Int_t TBasket::ReadBasketBuffers(Long64_t pos, Int_t len, TFile *file)
    // The function returns 0 in case of success, 1 in case of error
 
    Int_t badread= 0;
-   TDirectory::TContext ctxt(0);
-   fBranch->GetDirectory()->cd();
 
    if (fBranch->GetTree()->MemoryFull(fBufferSize)) fBranch->DropBaskets();
 
diff --git a/tree/src/TBranch.cxx b/tree/src/TBranch.cxx
index 128077e253c..55dd4690387 100644
--- a/tree/src/TBranch.cxx
+++ b/tree/src/TBranch.cxx
@@ -929,7 +929,6 @@ TBasket* TBranch::GetBasket(Int_t basketnumber)
    if (basket) return basket;
 
      // create/decode basket parameters from buffer
-   TDirectory::TContext ctxt(0);
    TFile *file = GetFile(0);
    basket = new TBasket(file);
    if (fSkipZip) basket->SetBit(TBufferFile::kNotDecompressed);
@@ -1188,8 +1187,11 @@ TFile* TBranch::GetFile(Int_t mode)
    delete [] bname;
 
    // Open file (new file if mode = 1)
-   if (mode) file = TFile::Open(bFileName, "recreate");
-   else      file = TFile::Open(bFileName);
+   { 
+      TDirectory::TContext ctxt(0);
+      if (mode) file = TFile::Open(bFileName, "recreate");
+      else      file = TFile::Open(bFileName);
+   }
    if (!file) return 0;
    if (file->IsZombie()) {delete file; return 0;}
    fDirectory = (TDirectory*)file;
diff --git a/tree/src/TBranchElement.cxx b/tree/src/TBranchElement.cxx
index 08d1f5ffa21..c6423a04b4b 100644
--- a/tree/src/TBranchElement.cxx
+++ b/tree/src/TBranchElement.cxx
@@ -3684,8 +3684,7 @@ void TBranchElement::Streamer(TBuffer& R__b)
          motherFileName = mother->GetFileName();
       }
       if ((fFileName.Length() > 0) && strcmp(motherFileName, fFileName.Data())) {
-         TDirectory::TContext ctxt(dirsav);
-         Write();
+         dirsav->WriteTObject(this);
       }
       fDirectory = dirsav;
    }
diff --git a/tree/src/TBranchObject.cxx b/tree/src/TBranchObject.cxx
index 01650083da3..069786c70ae 100644
--- a/tree/src/TBranchObject.cxx
+++ b/tree/src/TBranchObject.cxx
@@ -553,8 +553,7 @@ void TBranchObject::Streamer(TBuffer& R__b)
          motherFileName = mother->GetFileName();
       }
       if ((fFileName.Length() > 0) && strcmp(motherFileName, fFileName.Data())) {
-         TDirectory::TContext ctxt(dirsav);
-         Write();
+         dirsav->WriteTObject(this);
       }
       fDirectory = dirsav;
    }
diff --git a/tree/src/TChain.cxx b/tree/src/TChain.cxx
index e80af52730a..56debae9190 100644
--- a/tree/src/TChain.cxx
+++ b/tree/src/TChain.cxx
@@ -383,7 +383,6 @@ Int_t TChain::AddFile(const char* name, Long64_t nentries /* = kBigNumber */, co
    //      }
    
 
-   TDirectory::TContext ctxt(0);
    const char *treename = GetName();
    if (tname && strlen(tname) > 0) treename = tname;
    char *dot = (char*)strstr(name,".root");
@@ -421,7 +420,11 @@ Int_t TChain::AddFile(const char* name, Long64_t nentries /* = kBigNumber */, co
    // Open the file to get the number of entries.
    Int_t pksize = 0;
    if (nentries <= 0) {
-      TFile* file = TFile::Open(filename);
+      TFile* file;
+      {
+         TDirectory::TContext ctxt(0);
+         file = TFile::Open(filename);
+      }
       if (!file || file->IsZombie()) {
          delete file;
          file = 0;
@@ -1266,8 +1269,6 @@ Long64_t TChain::LoadTree(Long64_t entry)
       }
    }
 
-   TDirectory::TContext ctxt(0);
-
    TChainElement* element = (TChainElement*) fFiles->At(treenum);
    if (!element) {
       if (treeReadEntry) {
@@ -1282,7 +1283,10 @@ Long64_t TChain::LoadTree(Long64_t entry)
 
    // FIXME: We leak memory here, we've just lost the open file
    //        if we did not delete it above.
-   fFile = TFile::Open(element->GetTitle());
+   {
+      TDirectory::TContext ctxt(0);
+      fFile = TFile::Open(element->GetTitle());
+   }
 
    // ----- Begin of modifications by MvL
    Int_t returnCode = 0;
@@ -1490,7 +1494,10 @@ void TChain::Lookup(Bool_t force)
       TString eurl(elemurl.GetUrl());
       if (!stg || !stg->Matches(eurl)) {
          SafeDelete(stg);
-         stg = TFileStager::Open(eurl);
+         {
+            TDirectory::TContext ctxt(0);
+            stg = TFileStager::Open(eurl);
+         }
          if (!stg) {
             Error("Lookup", "TFileStager instance cannot be instantiated");
             break;
@@ -1606,7 +1613,7 @@ Long64_t TChain::Merge(const char* name, Option_t* option)
    //      ch.Merge(file);
    //
 
-   TFile* file = TFile::Open(name, "recreate", "chain files", 1);
+   TFile *file = TFile::Open(name, "recreate", "chain files", 1);
    return Merge(file, 0, option);
 }
 
diff --git a/tree/src/TFriendElement.cxx b/tree/src/TFriendElement.cxx
index d5256ec21f5..102425767c6 100644
--- a/tree/src/TFriendElement.cxx
+++ b/tree/src/TFriendElement.cxx
@@ -193,9 +193,9 @@ TFile *TFriendElement::GetFile()
 
    if (fFile || IsZombie()) return fFile;
 
-   TDirectory::TContext ctxt(gDirectory, 0);
 
    if (strlen(GetTitle())) {
+      TDirectory::TContext ctxt(gDirectory, 0);
       fFile = TFile::Open(GetTitle());
       fOwnFile = kTRUE;
    } else {
diff --git a/tree/src/TTree.cxx b/tree/src/TTree.cxx
index f44795c9dc8..a8e593f386c 100644
--- a/tree/src/TTree.cxx
+++ b/tree/src/TTree.cxx
@@ -877,14 +877,13 @@ Long64_t TTree::AutoSave(Option_t* option)
    TString opt = option;
    opt.ToLower();
    fSavedBytes = fTotBytes;
-   TDirectory *dirsav = gDirectory;
-   fDirectory->cd();
+
    TKey *key = (TKey*)fDirectory->GetListOfKeys()->FindObject(GetName());
    Long64_t nbytes;
    if (opt.Contains("overwrite")) {
-      nbytes = Write("",TObject::kOverwrite);
+      nbytes = fDirectory->WriteTObject(this,"","",TObject::kOverwrite);
    } else {
-      nbytes = Write(); //nbytes will be 0 if Write failed (disk space exceeded)
+      nbytes = fDirectory->WriteTObject(this); //nbytes will be 0 if Write failed (disk space exceeded)
       if (nbytes && key) {
          key->Delete();
          delete key;
@@ -896,7 +895,6 @@ Long64_t TTree::AutoSave(Option_t* option)
 
    if (opt.Contains("saveself")) fDirectory->SaveSelf();
 
-   dirsav->cd();
    return nbytes;
 }
 
@@ -6041,7 +6039,7 @@ void TTree::Streamer(TBuffer& b)
             fEstimate = 1000000;
          }
          fSavedBytes = fTotBytes;
-         gDirectory->Append(this);
+         fDirectory->Append(this);
          return;
       }
       //====process old versions before automatic schema evolution
@@ -6064,7 +6062,7 @@ void TTree::Streamer(TBuffer& b)
       fLeaves.Streamer(b);
       fSavedBytes = fTotBytes;
       fDirectory = gDirectory;
-      gDirectory->Append(this);
+      fDirectory->Append(this);
       if (R__v > 1) fIndexValues.Streamer(b);
       if (R__v > 2) fIndex.Streamer(b);
       if (R__v > 3) {
-- 
GitLab