The ROme OpTimistic Simulator  2.0.0
A General-Purpose Multithreaded Parallel/Distributed Simulation Platform
memusage.c
Go to the documentation of this file.
1 
33 #include <arch/memusage.h>
34 #include <mm/dymelor.h>
35 
36 
37 #if defined(_WIN32)
38 #include <windows.h>
39 #include <psapi.h>
40 
41 #elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
42 #include <unistd.h>
43 #include <sys/resource.h>
44 
45 #if defined(__APPLE__) && defined(__MACH__)
46 #include <mach/mach.h>
47 
48 #elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__)))
49 #include <fcntl.h>
50 #include <procfs.h>
51 
52 #elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
53 #include <stdio.h>
54 
55 #endif
56 
57 #else
58 #error "Cannot define getPeakRSS( ) or getCurrentRSS( ) for an unknown OS."
59 #endif
60 
61 
62 
70 size_t getPeakRSS(void)
71 {
72 #if defined(_WIN32)
73  /* Windows -------------------------------------------------- */
74  PROCESS_MEMORY_COUNTERS info;
75  GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) );
76  return (size_t)info.PeakWorkingSetSize;
77 
78 #elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__)))
79  /* AIX and Solaris ------------------------------------------ */
80  struct psinfo psinfo;
81  int fd = -1;
82  if ( (fd = open( "/proc/self/psinfo", O_RDONLY )) == -1 )
83  return (size_t)0L; /* Can't open? */
84  if ( read( fd, &psinfo, sizeof(psinfo) ) != sizeof(psinfo) )
85  {
86  close( fd );
87  return (size_t)0L; /* Can't read? */
88  }
89  close( fd );
90  return (size_t)(psinfo.pr_rssize * 1024L);
91 
92 #elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__))
93  /* BSD, Linux, and OSX -------------------------------------- */
94  struct rusage rusage;
95  getrusage( RUSAGE_SELF, &rusage );
96 #if defined(__APPLE__) && defined(__MACH__)
97  return (size_t)rusage.ru_maxrss;
98 #else
99  return (size_t)(rusage.ru_maxrss * 1024L);
100 #endif
101 
102 #else
103  /* Unknown OS ----------------------------------------------- */
104  return (size_t)0L; /* Unsupported. */
105 #endif
106 }
107 
108 
109 
110 
111 
119 size_t getCurrentRSS(void)
120 {
121 #if defined(_WIN32)
122  /* Windows -------------------------------------------------- */
123  PROCESS_MEMORY_COUNTERS info;
124  GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) );
125  return (size_t)info.WorkingSetSize;
126 
127 #elif defined(__APPLE__) && defined(__MACH__)
128  /* OSX ------------------------------------------------------ */
129  struct mach_task_basic_info info;
130  mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT;
131  if ( task_info( mach_task_self( ), MACH_TASK_BASIC_INFO,
132  (task_info_t)&info, &infoCount ) != KERN_SUCCESS )
133  return (size_t)0L; /* Can't access? */
134  return (size_t)info.resident_size;
135 
136 #elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__)
137  /* Linux ---------------------------------------------------- */
138  long rss = 0L;
139  FILE* fp = NULL;
140  if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL )
141  return (size_t)0L; /* Can't open? */
142  if ( fscanf( fp, "%*d %ld", &rss ) != 1 )
143  {
144  fclose( fp );
145  return (size_t)0L; /* Can't read? */
146  }
147  fclose( fp );
148  return (size_t)rss * 1024L;
149 
150 #else
151  /* AIX, BSD, Solaris, and Unknown OS ------------------------ */
152  return (size_t)0L; /* Unsupported. */
153 #endif
154 }
Dynamic Memory Logger and Restorer (DyMeLoR)
size_t getCurrentRSS(void)
Definition: memusage.c:119
Memory usage module header.
size_t getPeakRSS(void)
Definition: memusage.c:70