diff options
author | Anders Broman <anders.broman@ericsson.com> | 2013-07-30 05:49:58 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2013-07-30 05:49:58 +0000 |
commit | 78afe3fa82ffedaa2db9d6f89f9f357f8df1eb77 (patch) | |
tree | 41d5bb641e8f518a4b9fef0e0a33fea7b9eef96c /epan/app_mem_usage.c | |
parent | eb943806465e62d578488111a505b9a3c300f9a6 (diff) |
Add a routine to get application memory usage to epan.
svn path=/trunk/; revision=51023
Diffstat (limited to 'epan/app_mem_usage.c')
-rw-r--r-- | epan/app_mem_usage.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/epan/app_mem_usage.c b/epan/app_mem_usage.c new file mode 100644 index 0000000000..97eee7d706 --- /dev/null +++ b/epan/app_mem_usage.c @@ -0,0 +1,130 @@ +/* + * app_mem_usage.c + * + * $Id: get_app_mem_usage.c 50885 2013-07-25 04:40:37Z etxrab $ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/* code copied from ekg2, GPL-2 */ +#include "config.h" + +#include <glib.h> + +#include "app_mem_usage.h" + +#ifdef HAVE_SYS_UTSNAME_H +#include <sys/utsname.h> +#endif + +#ifdef _WIN32 +#include <windows.h> +#include <psapi.h> +#endif /* _WIN32 */ + +gsize +get_total_mem_used_by_app(void) +{ +#if defined(_WIN32) + HANDLE pHandle; + PROCESS_MEMORY_COUNTERS pmc; + SIZE_T workingSize = 0; + + pHandle = GetCurrentProcess(); + + if (GetProcessMemoryInfo(pHandle, &pmc, sizeof(pmc))){ + workingSize = pmc.WorkingSetSize; + + workingSize = workingSize / 1024; + } + + CloseHandle(pHandle); + + if(workingSize == 0){ + return -1; + }else{ + return (int)workingSize; + } +#else + char *temp, *p = NULL; + FILE *file = NULL; + size_t rd = 0; + int rozmiar = 0, unmres; + struct utsname sys; + + unmres = uname(&sys); + + temp = g_strdup_printf("/proc/%d/status", getpid()); + + if ( (unmres != -1 && !strcmp(sys.sysname, "FreeBSD")) || (file = fopen(temp,"rb")) ) { + g_free(temp); + { +#ifdef __linux__ + char buf[1024]; + + rd = fread(buf, 1, 1024, file); + fclose(file); + if (rd == 0) + { + return -1; + } + p = strstr(buf, "VmSize"); + if (p) { + sscanf(p, "VmSize: %d kB", &rozmiar); + } else { + return -1; + } +#elif __sun + pstatus_t proc_stat; + rd = fread(&proc_stat, sizeof(proc_stat), 1, file); + fclose(file); + if (rd == 0) + { + return -1; + } + rozmiar = proc_stat.pr_brksize + proc_stat.pr_stksize; +#elif __FreeBSD__ /* link with -lkvm */ + char errbuf[_POSIX2_LINE_MAX]; + int nentries = -1; + struct kinfo_proc *kp; + static kvm_t *kd; + + if (!(kd = kvm_openfiles(NULL /* "/dev/null" */, "/dev/null", NULL, /* O_RDONLY */0, errbuf))) { + return -1; + } + kp = kvm_getprocs(kd, KERN_PROC_PID, getpid(), &nentries); + if (!kp || nentries != 1) { + return -1; + } +#ifdef HAVE_STRUCT_KINFO_PROC_KI_SIZE + rozmiar = (u_long) kp->ki_size/1024; /* freebsd5 */ +#else + rozmiar = kp->kp_eproc.e_vm.vm_map.size/1024; /* freebsd4 */ +#endif /* HAVE_STRUCT_KINFO_PROC_KI_SIZE */ +#else + /* no /proc mounted */ + return -1; +#endif + } + } else { + return -1; + } + return rozmiar; +#endif /* (_WIN32) */ +}
\ No newline at end of file |