loolwsd/Makefile.am | 4 - loolwsd/configure.ac | 1 loolwsd/loolmap.c | 172 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 1 deletion(-)
New commits: commit 5c47150a68ee356c23598f62084218d3646b571d Author: Henry Castro <hcas...@collabora.com> Date: Sun Aug 2 08:22:40 2015 -0400 loolwsd: loolmap - report memory map of a process. Report memory total Shared Clean and Dirty pages. diff --git a/loolwsd/Makefile.am b/loolwsd/Makefile.am index 937bcb7..e15962a 100644 --- a/loolwsd/Makefile.am +++ b/loolwsd/Makefile.am @@ -1,4 +1,4 @@ -bin_PROGRAMS = loolwsd loolbroker loolkit +bin_PROGRAMS = loolwsd loolbroker loolkit loolmap dist_bin_SCRIPTS = loolwsd-systemplate-setup @@ -8,6 +8,8 @@ loolkit_SOURCES = LOOLKit.cpp LOOLSession.cpp ChildProcessSession.cpp Util.cpp L loolbroker_SOURCES = LOOLBroker.cpp Util.cpp +loolmap_SOURCES = loolmap.c + EXTRA_DIST = loolwsd.service sysconfig.loolwsd clean-cache: diff --git a/loolwsd/configure.ac b/loolwsd/configure.ac index 8d556fe..30ba066 100644 --- a/loolwsd/configure.ac +++ b/loolwsd/configure.ac @@ -13,6 +13,7 @@ AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CXX +AC_PROG_CC AC_LANG_PUSH([C++]) diff --git a/loolwsd/loolmap.c b/loolwsd/loolmap.c new file mode 100644 index 0000000..265e59c --- /dev/null +++ b/loolwsd/loolmap.c @@ -0,0 +1,172 @@ +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <dirent.h> +#include <locale.h> + +#define MAP_SIZE 20 +#define PATH_SIZE 64 +#define BUFFER_SIZE 9600 + +static int read_buffer( char *buffer, unsigned size, + const char *file, char sep ) +{ + int file_desc; + unsigned total_bytes = 0; + + file_desc = open(file, O_RDONLY); + if(file_desc == -1) + return 0; + + for(;;) + { + ssize_t number_bytes = read( file_desc, + buffer + total_bytes, + size - total_bytes ); + if(number_bytes == -1) + { + if(errno==EINTR) + continue; + break; + } + + total_bytes += number_bytes; + if(total_bytes == size) + { + --total_bytes; + break; + } + + if(number_bytes==0) + break; // EOF + } + + close(file_desc); + + if(total_bytes) + { + int i=total_bytes; + + while(i--) + if(buffer[i]=='\n' || buffer[i]=='\0') + buffer[i]=sep; + + if(buffer[total_bytes-1]==' ') + buffer[total_bytes-1]='\0'; + } + + buffer[total_bytes] = '\0'; + return total_bytes; +} + +static void total_smaps(unsigned proc_id, const char *file, const char *cmdline) +{ + FILE *file_pointer; + char buffer[BUFFER_SIZE]; + + unsigned long long private_dirty = 0ull; + unsigned long long private_clean = 0ull; + unsigned long long shared_dirty = 0ull; + unsigned long long shared_clean = 0ull; + unsigned long long total_private_dirty = 0ull; + unsigned long long total_private_clean = 0ull; + unsigned long long total_shared_dirty = 0ull; + unsigned long long total_shared_clean = 0ull; + unsigned long long smap_value; + char smap_key[MAP_SIZE]; + + if ((file_pointer = fopen(file, "r")) == NULL) + error(EXIT_FAILURE, errno, "%s", file); + + while (fgets(buffer, sizeof(buffer), file_pointer)) + { + if (buffer[0] >= 'A' && buffer[0] <= 'Z') + { + if (sscanf(buffer, "%20[^:]: %llu", smap_key, &smap_value) == 2) + { + if (strncmp("Shared_Dirty", smap_key, 12) == 0) + { + shared_dirty = smap_value; + total_shared_dirty += smap_value; + continue; + } + if (strncmp("Shared_Clean", smap_key, 12) == 0) + { + shared_clean = smap_value; + total_shared_clean += smap_value; + continue; + } + if (strncmp("Private_Dirty", smap_key, 13) == 0) + { + private_dirty = smap_value; + total_private_dirty += smap_value; + continue; + } + if (strncmp("Private_Clean", smap_key, 13) == 0) + { + private_clean = smap_value; + total_private_clean += smap_value; + continue; + } + } + } + } + + printf("%s\n", cmdline); + printf("Process ID :%20ld\n", proc_id); + printf("--------------------------------------\n"); + printf("Shared Clean :%20ld kB\n", total_shared_clean); + printf("Shared Diry :%20ld kB\n", total_shared_dirty); + printf("Private Clean :%20ld kB\n", total_private_dirty); + printf("Private Diry :%20ld kB\n\n", total_shared_dirty); +} + +int main(int argc, char **argv) +{ + DIR *root_proc; + struct dirent *dir_proc; + + unsigned pid_curr; + unsigned pid_proc; + char path_proc[PATH_SIZE]; + char cmdline[BUFFER_SIZE]; + + setlocale (LC_ALL, ""); + getopt(argc, argv, ""); + + argc -= optind; + argv += optind; + + if (argc != 1) + error(EXIT_FAILURE, EINVAL); + + root_proc = opendir("/proc"); + if (!root_proc) + error(EXIT_FAILURE, errno, "%s", "/proc"); + + pid_curr = getpid(); + + while ( ( dir_proc = readdir(root_proc) ) ) + { + if ( !dir_proc && !dir_proc->d_name ) + error(EXIT_FAILURE, ENOTDIR ); + + if ( *dir_proc->d_name > '0' && *dir_proc->d_name <= '9' ) + { + pid_proc = strtoul(dir_proc->d_name, NULL, 10); + snprintf(path_proc, sizeof(path_proc), "/proc/%s/%s", dir_proc->d_name, "cmdline"); + if (read_buffer(cmdline, sizeof(cmdline), path_proc, ' ') && + strstr(cmdline, argv[0]) && + pid_curr != pid_proc ) + { + snprintf(path_proc, sizeof(path_proc), "/proc/%s/%s", dir_proc->d_name, "smaps"); + total_smaps(pid_proc, path_proc, cmdline); + } + } + } + + return EXIT_SUCCESS; +} _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits