Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

memusage.C

Go to the documentation of this file.
00001 
00007 #include "memusage.h"
00008 #include "converse.h"
00009 #ifndef WIN32
00010 #include <stdio.h>
00011 #include <sys/types.h>
00012 #include <unistd.h>
00013 #else
00014 int sbrk(int) { return 0; }
00015 #endif
00016 
00017 int memusageinit::initialized;
00018 unsigned long memusageinit::sbrkval;
00019 
00020 memusageinit::memusageinit() {
00021   if ( initialized == 0 ) {
00022     sbrkval = (unsigned long) sbrk(0);
00023     initialized = 1;
00024   }
00025 }
00026 
00027 unsigned long memusageinit::memusage_sbrk() {
00028   unsigned long newval = (unsigned long) sbrk(0);
00029   return ( newval - memusageinit::sbrkval );
00030 }
00031 
00032 
00033 #ifdef WIN32
00034 #define MEMUSAGE_USE_SBRK
00035 #endif
00036 
00037 #ifdef _NO_MALLOC_H
00038 #define NO_MALLINFO
00039 #endif
00040 
00041 #ifdef MEMUSAGE_USE_SBRK
00042 #define NO_MALLINFO
00043 #define NO_PS
00044 #endif
00045 
00046 
00047 #ifdef MEMUSAGE_USE_MSTATS
00048 
00049 #include <malloc/malloc.h>
00050 
00051 unsigned long memusage_mstats() {
00052   struct mstats ms = mstats();
00053   unsigned long memtotal = ms.bytes_used;
00054   return memtotal;
00055 }
00056 
00057 #else
00058 inline unsigned long memusage_mstats() { return 0; }
00059 #endif
00060 
00061 
00062 #ifndef NO_MALLINFO
00063 
00064 #include <malloc.h>
00065 
00066 unsigned long memusage_mallinfo() {
00067   struct mallinfo mi = mallinfo();
00068   // unsigned long memtotal = mi.usmblks + mi.uordblks + mi.hblkhd;
00069   unsigned long memtotal = (unsigned int) mi.uordblks;
00070   unsigned long memtotal2 = (unsigned int) mi.usmblks;
00071   memtotal2 += (unsigned int) mi.hblkhd;
00072   if ( memtotal2 > memtotal ) memtotal = memtotal2;
00073 
00074   // printf("mallinfo %d %d %d\n", mi.usmblks, mi.uordblks, mi.hblkhd);
00075 
00076   return memtotal;
00077 }
00078 
00079 #else
00080 inline unsigned long memusage_mallinfo() { return 0; }
00081 #endif
00082 
00083 
00084 #ifndef NO_PS
00085 
00086 inline unsigned long memusage_ps() {
00087   char pscmd[100];
00088   sprintf(pscmd, "/bin/ps -o vsz= -p %d", getpid());
00089   unsigned long vsz = 0;
00090   FILE *p = popen(pscmd, "r");
00091   if ( p ) {
00092     fscanf(p, "%ld", &vsz);
00093     pclose(p);
00094   }
00095   return ( vsz * (unsigned long) 1024 );
00096 }
00097 
00098 #else
00099 inline unsigned long memusage_ps() { return 0; }
00100 #endif
00101 
00102 
00103 unsigned long memusage(const char **source) {
00104 
00105   unsigned long memtotal = 0;
00106   const char* s = "ERROR";
00107 
00108 #if CHARM_VERSION > 50911
00109   if (CmiMemoryIs(CMI_MEMORY_IS_GNU) ) memtotal = CmiMemoryUsage();
00110   s = "CmiMemoryUsage";
00111 #endif
00112 
00113   if ( ! memtotal ) { memtotal = memusage_mstats(); s = "mstats"; }
00114 
00115   if ( ! memtotal ) { memtotal = memusage_mallinfo(); s = "mallinfo"; }
00116 
00117   if ( ! memtotal ) { memtotal = memusageinit::memusage_sbrk(); s = "sbrk"; }
00118 
00119   if ( ! memtotal ) { memtotal = memusage_ps(); s = "ps"; }
00120 
00121   if ( ! memtotal ) s = "nothing";
00122 
00123   if ( source ) *source = s;
00124 
00125   return memtotal;
00126 
00127 }
00128 

Generated on Sat Sep 6 04:07:41 2008 for NAMD by  doxygen 1.3.9.1