diff --git a/src/memoryusage.cpp b/src/memoryusage.cpp index ded5130e8b63d09def7adf5510e073092fcd6a50..d620569beca423f2c08b380d36d82ee7b7878f8c 100644 --- a/src/memoryusage.cpp +++ b/src/memoryusage.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #ifndef WIN32 #include #endif @@ -41,13 +42,18 @@ namespace Transport { #ifndef WIN32 #ifdef BSD -void process_mem_usage(double& vm_usage, double& resident_set) { +void process_mem_usage(double& vm_usage, double& resident_set, pid_t pid) { int mib[4]; size_t size; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; - mib[3] = getpid(); + if (pid == 0) { + mib[3] = getpid(); + } + else { + mib[3] = pid; + } struct kinfo_proc proc; size = sizeof(struct kinfo_proc); @@ -75,7 +81,7 @@ void process_mem_usage(double& vm_usage, double& resident_set) { vm_usage = (double) proc.ki_size; } #else /* BSD */ -void process_mem_usage(double& shared, double& resident_set) { +void process_mem_usage(double& shared, double& resident_set, pid_t pid) { using std::ios_base; using std::ifstream; using std::string; @@ -84,8 +90,11 @@ void process_mem_usage(double& shared, double& resident_set) { resident_set = 0.0; // 'file' stat seems to give the most reliable results - // - ifstream stat_stream("/proc/self/statm",ios_base::in); + std::string f = "/proc/self/statm"; + if (pid != 0) { + f = "/proc/" + boost::lexical_cast(pid) + "/statm"; + } + ifstream stat_stream(f.c_str(), ios_base::in); if (!stat_stream.is_open()) { shared = 0; resident_set = 0; @@ -94,7 +103,7 @@ void process_mem_usage(double& shared, double& resident_set) { // dummy vars for leading entries in stat that we don't care about // - string pid, comm, state, ppid, pgrp, session, tty_nr; + string pid1, comm, state, ppid, pgrp, session, tty_nr; string tpgid, flags, minflt, cminflt, majflt, cmajflt; string utime, stime, cutime, cstime, priority, nice; string O, itrealvalue, starttime;