[Libreoffice-commits] online.git: Branch 'private/hcvcastro/forking' - loolwsd/configure.ac loolwsd/loolmap.c loolwsd/Makefile.am
Henry Castro
hcastro at collabora.com
Sun Aug 2 05:31:17 PDT 2015
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 <hcastro at 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;
+}
More information about the Libreoffice-commits
mailing list