Eneboo - Documentación para desarrolladores
src/hoard/src/heaplayers/traceheap.h
Ir a la documentación de este archivo.
00001 /* -*- C++ -*- */
00002 
00003 #ifndef _TRACEHEAP_H_
00004 #define _TRACEHEAP_H_
00005 
00006 #include <cstdlib>
00007 
00008 #ifdef WIN32
00009 #include <io.h>
00010 #endif
00011 
00012 #include <fcntl.h>
00013 #include <sys/types.h>
00014 #include <sys/stat.h>
00015 #include <string.h>
00016 #include <cstdio>
00017 
00018 // An object that manages direct writing to a file.
00019 
00020 class FileObject {
00021 public:
00022 
00023   FileObject (void)
00024     : isOpen (0)
00025   {}
00026  
00027   ~FileObject (void) {
00028     close();
00029   }
00030  
00031   void open (char * fname)
00032   {
00033 #if 1
00034     file = fopen(fname, "w+");
00035 #else
00036 #ifdef WIN32
00037     file = _open(fname, _O_WRONLY | _O_CREAT, _S_IREAD | _S_IWRITE);
00038 #else
00039     file = ::open(fname, O_WRONLY | O_CREAT, S_IREAD | S_IWRITE);
00040 #endif
00041 #endif
00042   }
00043  
00044   int is_open (void) {
00045     return isOpen;
00046   }
00047  
00048   void close (void)
00049   {
00050     if (isOpen) {
00051 #if 1
00052       fclose (file);
00053 #else
00054 #ifdef WIN32
00055       _close (file);
00056 #else
00057       ::close (file);
00058 #endif
00059 #endif
00060       isOpen = 0;
00061     }
00062   }
00063  
00064  
00065   friend FileObject& operator<<(FileObject& f, int n) {
00066     //          fprintf (f.file, "%d", n);
00067     char buf[255];
00068     sprintf (buf, "%d", n);
00069     f.writeString (buf);
00070     return f;
00071   }
00072  
00073   friend FileObject& operator<<(FileObject& f, char * s) {
00074     //                      fprintf (f.file, "%s", s);
00075     char buf[255];
00076     sprintf (buf, "%s", s);
00077     f.writeString (buf);
00078     return f;
00079   }
00080  
00081   friend FileObject& operator<<(FileObject& f, void * s) {
00082     //                      fprintf (f.file, "%p", s);
00083     char buf[255];
00084     sprintf (buf, "%p", s);
00085     f.writeString (buf);
00086     return f;
00087   }
00088  
00089 private:
00090 
00091   void writeString (char * buf) {
00092 #if 1
00093           fprintf(file, buf);
00094 #else
00095 #ifdef WIN32
00096     _write (file, buf, strlen(buf));
00097 #else
00098     write (file, buf, strlen(buf));
00099 #endif
00100 #endif
00101   }
00102 
00103 #if 1
00104   FILE * file;
00105 #else
00106   int file;
00107 #endif
00108 
00109   bool isOpen;
00110 
00111 };
00112 
00113 
00114 // The TraceHeap itself.
00115 // Traces malloc & free calls.
00116  
00117 template <class Super, int Number>
00118 class TraceHeap : public Super {
00119 public:
00120 
00121   TraceHeap (void)
00122   {
00123     if (!theFile().is_open()) {
00124       char fname[255];
00125       sprintf (fname, "trace-%d", Number);
00126       theFile().open (fname);
00127       printf ("OPEN %s\n", fname);
00128     }
00129     getRefs()++;
00130   }
00131  
00132   ~TraceHeap (void)
00133   {
00134     //                      theFile() << ::std::flush;
00135     --getRefs();
00136     if (getRefs() == 0) {
00137       if (theFile().is_open())
00138         theFile().close();
00139     }
00140   }
00141  
00142   inline void * malloc (size_t sz) {
00143     void * ptr = Super::malloc (sz);
00144     theFile() << "M " << Number << "\t" << sz << "\t" << ptr << "\n";
00145     return ptr;
00146   }
00147   
00148   inline void free (void * ptr) {
00149     theFile() << "F " << Number << "\t" << ptr << "\n";
00150     Super::free (ptr);
00151   }
00152  
00153 private:
00154  
00155   FileObject& theFile (void) {
00156     static FileObject f;
00157     return f;
00158   }
00159  
00160   int& getRefs (void) {
00161     static int refs = 0;
00162     return refs;
00163   }
00164  
00165 };
00166  
00167  
00168 #endif
00169 
00170 #if 0
00171 /* -*- C++ -*- */
00172 #ifndef _TRACEHEAP_H_
00173 #define _TRACEHEAP_H_
00174 // #include <iostream.h>
00175 //#include <fstream.h>
00176 #include <fstream>
00177 #include <map>
00178 
00179 template <class Super, int Number>
00180 class TraceHeap : public Super {
00181 public:
00182   
00183   TraceHeap (void)
00184   {
00185     if (!theFile().is_open()) {
00186       printf ("OPEN\n");
00187       theFile().open ("trace");
00188     }
00189     getRefs()++;
00190   }
00191   ~TraceHeap (void)
00192   {
00193     theFile() << ::std::flush;
00194     --getRefs();
00195     if (getRefs() == 0) {
00196       if (theFile().is_open())
00197         theFile().close();
00198     }
00199   }
00200   inline void * malloc (size_t sz) {
00201     void * ptr = Super::malloc (sz);
00202     theFile() << "M\t" << sz << "\t" << ptr << "\n";
00203     return ptr;
00204   }
00205   
00206   inline void free (void * ptr) {
00207     theFile() << "F\t" << ptr << "\n";
00208     Super::free (ptr);
00209   }
00210 private:
00211   std::ofstream& theFile (void) {
00212     static std::ofstream f;
00213     return f;
00214   }
00215   int& getRefs (void) {
00216     static int refs = 0;
00217     return refs;
00218   }
00219 };
00220 
00221 #endif
00222 #endif
 Todo Clases Namespaces Archivos Funciones Variables 'typedefs' Enumeraciones Valores de enumeraciones Propiedades Amigas 'defines'