| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

RootOutputFileManager.cc

Go to the documentation of this file.
00001 #include "RootOutputFileManager.h"
00002 #include "RootIOSvc/RootIOIncident.h"
00003 #include "GaudiKernel/IIncidentSvc.h"
00004 
00005 #include "TFile.h"
00006 
00007 using namespace std;
00008 
00009 RootOutputFileManager::RootOutputFileManager()
00010     : m_incsvc(0)
00011 {
00012 }
00013 
00014 RootOutputFileManager::~RootOutputFileManager()
00015 {
00016     if (m_incsvc) {
00017         m_incsvc->release();
00018     }
00019     m_incsvc = 0;
00020 }
00021 
00022 RootOutputFileManager& RootOutputFileManager::get()
00023 {
00024     static RootOutputFileManager* me = 0;
00025     if (!me) me = new RootOutputFileManager;
00026     return *me;
00027 }
00028 
00029 
00030 void RootOutputFileManager::setIncidentSvc(IIncidentSvc* incsvc)
00031 {
00032     if (m_incsvc) {
00033         m_incsvc->release();
00034         m_incsvc = 0;
00035     }
00036     m_incsvc = incsvc;
00037     if (m_incsvc) {
00038         m_incsvc->addRef();
00039     }
00040 }
00041 
00042 TFile*& RootOutputFileManager::file(FileMap::iterator& it) 
00043 {
00044     return it->second.second; 
00045 }
00046 
00047 int& RootOutputFileManager::count(FileMap::iterator& it) 
00048 {
00049     return it->second.first; 
00050 }
00051 
00052 void RootOutputFileManager::fire(const std::string& filename, RootIOIncident::FileState state)
00053 {
00054     if (!m_incsvc) {
00055         return;                 // error message?
00056     }
00057 
00058     m_incsvc->fireIncident(RootIOIncident("RootOutputFileManager","RootIOIncident",filename,state));    
00059 }
00060 
00061 TFile* RootOutputFileManager::get_file(const string& filename) {
00062     FileMap::iterator it = m_filemap.find(filename);
00063     if (it == m_filemap.end()) {  // miss
00064  
00065         TFile* file = TFile::Open(filename.c_str(),"recreate","RootOutputStream file");
00066         m_filemap[filename] = pair<int,TFile*>(1,file);
00067         this->fire(filename,RootIOIncident::opened_output);
00068         return file;
00069     }
00070     // hit
00071     ++count(it);
00072     return file(it);
00073 }
00074 
00075 void RootOutputFileManager::close_file(TFile*& tfile) {
00076     string filename = tfile->GetName();
00077     tfile = 0;
00078     FileMap::iterator it = m_filemap.find(filename);
00079     if (it == m_filemap.end()) {  // miss, already closed?
00080         return;
00081     }
00082 
00083     --count(it);
00084     if (count(it)) return;  // still more references
00085 
00086     this->fire(filename,RootIOIncident::closing_output);
00087     file(it)->Close();
00088     this->fire(filename,RootIOIncident::closed_output);
00089     delete file(it);
00090     file(it) = 0;
00091     m_filemap.erase(it);
00092 }
00093 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:18:19 2011 for RootIOSvc by doxygen 1.4.7