// MemoryUsage.cxx #include "dataset_util/MemoryUsage.h" #include "dataset_util/Text.h" #include #include #include #include "unistd.h" using std::string; using std::ostream; using std::istringstream; using std::ostringstream; #include //********************************************************************** // Local definitions. //********************************************************************** namespace { // Convert string to int. size_t ival(string(sval)) { istringstream ssval(sval); size_t ival = 0; ssval >> ival; return ival; } } // end unnamed namespace //********************************************************************** //********************************************************************** // Member functions. //********************************************************************** // Default constructor. MemoryUsage::MemoryUsage() : m_pid(getpid()), m_err(0), m_total(0), m_resident(0) { update(); } //********************************************************************** // Process constructor. MemoryUsage::MemoryUsage(pid_t pid) : m_pid(pid), m_err(0), m_total(0), m_resident(0) { update(); } //********************************************************************** // Update. int MemoryUsage::update() { ostringstream sfname; sfname << "/proc/" << m_pid << "/statm"; string fname = sfname.str(); Text tmem(fname); if ( tmem.size() != 1 ) { return m_err=1; } Text::WordList vals = Text::split(tmem.line(0)); if ( vals.size() != 7 ) { return m_err=2; } size_t pagesize = getpagesize(); if ( pagesize <= 0 ) { return m_err=3; } m_total = pagesize*ival(vals[0]); m_resident = pagesize*ival(vals[1]); return m_err=0; } //********************************************************************** // Validity. bool MemoryUsage::is_valid() const { return m_err == 0; } //********************************************************************** // Error code. int MemoryUsage::error() const { return m_err; } //********************************************************************** // Process ID. pid_t MemoryUsage::pid() const { return m_pid; } //********************************************************************** // Total memory usage. size_t MemoryUsage::total() const { return m_total; } //********************************************************************** // Resident memory. size_t MemoryUsage::resident() const { return m_resident; } //********************************************************************** // Free functions. //********************************************************************** // Output stream. ostream& operator<<(ostream& lhs, const MemoryUsage& rhs) { lhs << "Memory usage for process " << rhs.pid() << ":"; if ( ! rhs.is_valid() ) { lhs << "\nINVALID: error " << rhs.error(); return lhs; } string suffix = " KB"; int fac = 1000; lhs << "\n Total: " << rhs.total()/fac << suffix; lhs << "\n Resident: " << rhs.resident()/fac << suffix; return lhs; } //**********************************************************************