00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROOT_TMapFile
00013 #define ROOT_TMapFile
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifdef WIN32
00036 #include "Windows4Root.h"
00037 #endif
00038 #ifndef ROOT_TObject
00039 #include "TObject.h"
00040 #endif
00041 #ifndef ROOT_TROOT
00042 #include "TROOT.h"
00043 #endif
00044 #if !defined(__MMPRIVATE_H) && !defined(__CINT__)
00045 #include "mmprivate.h"
00046 #endif
00047
00048
00049 class TBrowser;
00050 class TDirectory;
00051 class TList;
00052 class TMapRec;
00053
00054 class TMapFile : public TObject {
00055
00056 friend class TMapRec;
00057
00058 private:
00059 Int_t fFd;
00060 Int_t fVersion;
00061 char *fName;
00062 char *fTitle;
00063 char *fOption;
00064 void *fMmallocDesc;
00065 ULong_t fBaseAddr;
00066 Int_t fSize;
00067 TMapRec *fFirst;
00068 TMapRec *fLast;
00069 Long_t fOffset;
00070 TDirectory *fDirectory;
00071 TList *fBrowseList;
00072 Bool_t fWritable;
00073 Int_t fSemaphore;
00074 ULong_t fhSemaphore;
00075 TObject *fGetting;
00076 Int_t fWritten;
00077 Double_t fSumBuffer;
00078 Double_t fSum2Buffer;
00079
00080 static Long_t fgMapAddress;
00081 static void *fgMmallocDesc;
00082
00083 protected:
00084 TMapFile();
00085 TMapFile(const char *name, const char *title, Option_t *option, Int_t size, TMapFile *&newMapFile);
00086 TMapFile(const TMapFile &f, Long_t offset = 0);
00087 void operator=(const TMapFile &rhs);
00088
00089 TMapFile *FindShadowMapFile();
00090 void InitDirectory();
00091 TObject *Remove(TObject *obj, Bool_t lock);
00092 TObject *Remove(const char *name, Bool_t lock);
00093 void SumBuffer(Int_t bufsize);
00094 Int_t GetBestBuffer();
00095
00096 void CreateSemaphore(Int_t pid=0);
00097 Int_t AcquireSemaphore();
00098 Int_t ReleaseSemaphore();
00099 void DeleteSemaphore();
00100
00101 static void *MapToAddress();
00102
00103 public:
00104 enum { kDefaultMapSize = 0x80000 };
00105
00106
00107 virtual ~TMapFile();
00108 void operator delete(void *vp);
00109
00110 void Browse(TBrowser *b);
00111 void Close(Option_t *option = "");
00112 void *GetBaseAddr() const { return (void *)fBaseAddr; }
00113 void *GetBreakval() const;
00114 TDirectory *GetDirectory() const {return fDirectory;}
00115 Int_t GetFd() const { return fFd; }
00116 void *GetMmallocDesc() const { return fMmallocDesc; }
00117 const char *GetName() const { return fName; }
00118 Int_t GetSize() const { return fSize; }
00119 const char *GetOption() const { return fOption; }
00120 const char *GetTitle() const { return fTitle; }
00121 TMapRec *GetFirst() const { return (TMapRec*)((Long_t) fFirst + fOffset); }
00122 TMapRec *GetLast() const { return (TMapRec*)((Long_t) fLast + fOffset); }
00123 Bool_t IsFolder() const;
00124 Bool_t IsWritable() const { return fWritable; }
00125 void *OrgAddress(void *addr) const { return (void *)((Long_t)addr - fOffset); }
00126 void Print(Option_t *option="") const;
00127 void ls(Option_t *option="") const;
00128 Bool_t cd(const char *path = 0);
00129
00130 void Add(const TObject *obj, const char *name = "");
00131 void Update(TObject *obj = 0);
00132 TObject *Remove(TObject *obj) { return Remove(obj, kTRUE); }
00133 TObject *Remove(const char *name) { return Remove(name, kTRUE); }
00134 void RemoveAll();
00135 TObject *Get(const char *name, TObject *retObj = 0);
00136
00137 static TMapFile *Create(const char *name, Option_t *option="READ", Int_t size=kDefaultMapSize, const char *title="");
00138 static TMapFile *WhichMapFile(void *addr);
00139 static void SetMapAddress(Long_t addr);
00140
00141 ClassDef(TMapFile,0)
00142 };
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 class TMapRec {
00156
00157 friend class TMapFile;
00158
00159 private:
00160 char *fName;
00161 char *fClassName;
00162 TObject *fObject;
00163 void *fBuffer;
00164 Int_t fBufSize;
00165 TMapRec *fNext;
00166
00167 public:
00168 TMapRec(const char *name, const TObject *obj, Int_t size, void *buf);
00169 ~TMapRec();
00170 const char *GetName(Long_t offset = 0) const { return (char *)((Long_t) fName + offset); }
00171 const char *GetClassName(Long_t offset = 0) const { return (char *)((Long_t) fClassName + offset); }
00172 void *GetBuffer(Long_t offset = 0) const { return (void *)((Long_t) fBuffer + offset); }
00173 Int_t GetBufSize() const { return fBufSize; }
00174 TObject *GetObject() const;
00175 TMapRec *GetNext(Long_t offset = 0) const { return (TMapRec *)((Long_t) fNext + offset); }
00176 };
00177
00178
00179
00180 inline void *TMapFile::GetBreakval() const
00181 {
00182
00183
00184
00185 if (!fMmallocDesc) return 0;
00186 return (void *)((struct mdesc *)fMmallocDesc)->breakval;
00187 }
00188
00189
00190 inline TMapFile *TMapFile::WhichMapFile(void *addr)
00191 {
00192 if (!gROOT || !gROOT->GetListOfMappedFiles()) return 0;
00193
00194 TObjLink *lnk = ((TList *)gROOT->GetListOfMappedFiles())->LastLink();
00195 while (lnk) {
00196 TMapFile *mf = (TMapFile*)lnk->GetObject();
00197 if (!mf) return 0;
00198 if ((ULong_t)addr >= mf->fBaseAddr + mf->fOffset &&
00199 (ULong_t)addr < (ULong_t)mf->GetBreakval() + mf->fOffset)
00200 return mf;
00201 lnk = lnk->Prev();
00202 }
00203 return 0;
00204 }
00205
00206 R__EXTERN void *gMmallocDesc;
00207
00208 #endif