Dear Rooter I am trying to loop over the objects in a TMapfile. (actually i would like to collect them in a TList) Right now the map file contains three histograms. I followed Otto Schaile 's proposal and created a TMapRec.h file and tried the following code to loop over the objects. It looks like the GetLast method doesn't work as you can see from the output of the little test program. Also what is the best way to loop over the element in a Mapfile? cheers Hans #ifndef __CINT__ #include <iostream.h> #include "TROOT.h" #include "TApplication.h" #include "TH1.h" #include "TH2.h" #include "TSocket.h" #include "TServerSocket.h" #include "TInetAddress.h" #include "TMessage.h" #include "TMonitor.h" #include "TSystem.h" #include "TMapFile.h" #include "TList.h" #include "TSortedList.h" #include "TObjArray.h" #include "TOrdCollection.h" #include "THashTable.h" #include "TMapRec.h" #include "TString.h" int main() { TROOT server_ybs("server_ybs","Test of simple histogram server"); #endif #ifdef __CINT__ { gROOT->Reset(); #endif // Open the memory mapped file "hsimple.map" in "READ" (default) mode. TMapFile *mfile; mfile = TMapFile::Create("hsimple.map"); // Print status of mapped file and list its contents mfile->Print(); mfile->ls(); cout << "hello World"<< endl; TMapRec *mfirst= mfile->GetFirst(); TMapRec *mr = mfile->GetFirst(); TMapRec *mlast = mfile->GetLast(); TString name=mr->GetName(); cout << name << endl; name=mfirst->GetName(); cout << name << endl; name=mlast->GetName(); cout << name << endl; // TObject * obj =0; // obj = (TObject*)mfile->Get(name.Data(),obj); while (1) { mr = mr->GetNext(); name = mr->GetName(); cout << name << endl; if(mr==mlast){ cout << "out of the loop"<< endl; break; } } cdfsga:/data69/upgrade/wenzel/server > server_ybs_old Memory mapped file: hsimple.map Title: Demo memory mapped file with histograms Option: READ Mapped Memory region: 0x43c0000 - 0x43d86a0 (0.10 MB) Current breakval: 0x43ce000 Object Class Size histo1 TH1F 1024 histo2 TH1F 1024 histo3 TH2F 11328 hello World histo1 histo1 *** Break *** segmentation violation Abort (core dumped) This is the TMapRec.h file //*CMZ : 2.21/05 08/02/99 11.48.30 by Fons Rademakers //*CMZ : 2.21/04 29/01/99 12.53.31 by Fons Rademakers //*CMZ : 2.00/12 02/10/98 12.45.22 by Fons Rademakers //*CMZ : 2.00/10 29/07/98 11.24.27 by Rene Brun //*CMZ : 2.00/09 22/06/98 08.29.53 by Rene Brun //*CMZ : 2.00/08 04/06/98 11.13.44 by Fons Rademakers //*CMZ : 2.00/04 03/04/98 16.50.01 by Rene Brun //*CMZ : 1.03/09 16/12/97 16.35.32 by Rene Brun //*-- Author : Fons Rademakers 08/07/97 //*KEEP,CopyRight,T=C. /************************************************************************* * Copyright(c) 1995-1998, The ROOT System, All rights reserved. * * Authors: Rene Brun, Nenad Buncic, Valery Fine, Fons Rademakers. * * * * Permission to use, copy, modify and distribute this software and its * * documentation for non-commercial purposes is hereby granted without * * fee, provided that the above copyright notice appears in all copies * * and that both the copyright notice and this permission notice appear * * in the supporting documentation. The authors make no claims about the * * suitability of this software for any purpose. * * It is provided "as is" without express or implied warranty. * *************************************************************************/ //*KEND. #ifdef WIN32 //*KEEP,OptimizeOff,T=C++. #if defined(__hpux) && !defined(__GNUG__) #pragma OPTIMIZE OFF #endif #if defined(_AIX) && !defined(__GNUG__) #endif #if defined(__alpha) && !defined(__GNUG__) #endif #if defined(__sun) && !defined(__GNUG__) #endif #if defined(__sgi) && !defined(__GNUG__) #endif #if defined(_linux) #endif #ifdef WIN32 #pragma optimize("",off) #endif //*KEND. #endif ////////////////////////////////////////////////////////////////////////// // // // TMapFile // // // // This class implements a shared memory region mapped to a file. // // Objects can be placed into this shared memory area using the Add() // // member function. Whenever the mapped object(s) change(s) call // // Update() to put a fresh copy in the shared memory. This extra // // step is necessary since it is not possible to share objects with // // virtual pointers between processes (the vtbl ptr points to the // // originators unique address space and can not be used by the // // consumer process(es)). Consumer processes can map the memory region // // from this file and access the objects stored in it via the Get() // // method (which returns a copy of the object stored in the shared // // memory with correct vtbl ptr set). Only objects of classes with a // // Streamer() member function defined can be shared. // // // ////////////////////////////////////////////////////////////////////////// #ifdef WIN32 # include <windows.h> # include <process.h> # ifdef GetObject # undef GetObject # endif # define HAVE_SEMOP #else # define INVALID_HANDLE_VALUE -1 #endif #include <fcntl.h> #include <errno.h> //*KEEP,TMapFile. #include "TMapFile.h" //*KEEP,TKeyMapFile,T=C++. #include "TKeyMapFile.h" //*KEEP,TDirectory. #include "TDirectory.h" //*KEEP,TBrowser. #include "TBrowser.h" //*KEEP,TString. #include "TString.h" //*KEEP,TSystem. #include "TSystem.h" //*KEEP,TClass. #include "TClass.h" //*KEEP,mmprivate. #include "mmprivate.h" //*KEND. #ifdef R__UNIX #define HAVE_SEMOP #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #if defined(R__HPUX) || defined (R__ALPHA) || defined (R__SOLARIS) || \ defined(R__AIX) || defined(R__HIUX) || defined (R__MKLINUX) union semun { int val; // value for SETVAL struct semid_ds *buf; // buffer for IPC_STAT & IPC_SET ushort *array; // array for GETALL & SETALL }; #endif #ifdef R__LINUX # define SEM_A 0200 // alter permission # define SEM_R 0400 // read permission #endif #endif Long_t TMapFile::fgMapAddress = 0; void *TMapFile::fgMmallocDesc = 0; void *gMmallocDesc = 0; class TMapRec { friend class TMapFile; private: char *fName; // object name char *fClassName; // class name TObject *fObject; // pointer to original object void *fBuffer; // buffer containing object of class name Int_t fBufSize; // buffer size TMapRec *fNext; // next MapRec in list public: TMapRec(const char *name, TObject *obj, Int_t size, void *buf); ~TMapRec(); const char *GetName(Long_t offset = 0) const { return (char *)((Long_t) fName + offset); } const char *GetClassName(Long_t offset = 0) const { return (char *)((Long_t) fClassName + offset); } void *GetBuffer(Long_t offset = 0) const { return (void *)((Long_t) fBuffer + offset); } Int_t GetBufSize() const { return fBufSize; } TMapRec *GetNext(Long_t offset = 0) const { return (TMapRec *)((Long_t) fNext + offset); } }; TMapRec::TMapRec(const char *name, TObject *obj, Int_t size, void *buf) { fName = StrDup(name); fClassName = 0; fObject = obj; fBuffer = buf; fBufSize = size; fNext = 0; } TMapRec::~TMapRec() { delete [] fName; delete [] fClassName; }
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:29 MET