X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fbase%2Fhostinfo.cc;h=be3d46ff99fd05236dda6902a5dc43570105b752;hb=cc791d51a2c641bf96ae89bcaa53591ba75b4956;hp=7cc07c11e169512a591c1113da7ce707ee762933;hpb=17cbfe55fdd80ccd4c9c33ade3b636ba793def56;p=gem5.git diff --git a/src/base/hostinfo.cc b/src/base/hostinfo.cc index 7cc07c11e..be3d46ff9 100644 --- a/src/base/hostinfo.cc +++ b/src/base/hostinfo.cc @@ -24,22 +24,30 @@ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Nathan Binkert */ -#include -#include -#include #include -#include +#ifdef __APPLE__ +#include +#include +#include + +#endif + +#include "base/hostinfo.hh" + +#include +#include +#include +#include #include #include #include -#include "base/misc.hh" -#include "sim/host.hh" +#include "base/logging.hh" +#include "base/str.hh" +#include "base/types.hh" using namespace std; @@ -60,7 +68,7 @@ hostname() } uint64_t -procInfo(char *filename, char *target) +procInfo(const char *filename, const char *target) { int done = 0; char line[80]; @@ -71,7 +79,7 @@ procInfo(char *filename, char *target) while (fp && !feof(fp) && !done) { if (fgets(line, 80, fp)) { - if (strncmp(line, target, strlen(target)) == 0) { + if (startswith(line, target)) { snprintf(format, sizeof(format), "%s %%ld", target); sscanf(line, format, &usage); @@ -82,7 +90,31 @@ procInfo(char *filename, char *target) } if (fp) - fclose(fp); + fclose(fp); return 0; } + +uint64_t +memUsage() +{ +// For the Mach-based Darwin kernel, use the task_info of the self task +#ifdef __APPLE__ + struct task_basic_info t_info; + mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; + + if (KERN_SUCCESS != task_info(mach_task_self(), + TASK_BASIC_INFO, (task_info_t)&t_info, + &t_info_count)) { + return 0; + } + + // Mimic Darwin's implementation of top and subtract + // SHARED_REGION_SIZE from the tasks virtual size to account for the + // shared memory submap that is incorporated into every process. + return (t_info.virtual_size - SHARED_REGION_SIZE) / 1024; +#else + // Linux implementation + return procInfo("/proc/self/status", "VmSize:"); +#endif +}