summaryrefslogtreecommitdiff
path: root/src/zmalloc.c
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2012-11-19 11:24:56 +0100
committerantirez <antirez@gmail.com>2012-11-19 11:47:35 +0100
commit3bfeb9c1a7044cd96c1bd77677dfe8b575c73c5f (patch)
tree6686c29391c368296fa817ccb88f065f8a37b2f2 /src/zmalloc.c
parentaf0b220756571bc8faf57a0c7b7389dd86a60376 (diff)
downloadredis-3bfeb9c1a7044cd96c1bd77677dfe8b575c73c5f.tar.gz
zmalloc_get_private_dirty() function added (Linux only).
For non Linux systmes it just returns 0. This function is useful to estimate copy-on-write because of childs saving stuff on disk.
Diffstat (limited to 'src/zmalloc.c')
-rw-r--r--src/zmalloc.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/zmalloc.c b/src/zmalloc.c
index 1ebf68d17..1f8c7f08e 100644
--- a/src/zmalloc.c
+++ b/src/zmalloc.c
@@ -324,3 +324,28 @@ size_t zmalloc_get_rss(void) {
float zmalloc_get_fragmentation_ratio(void) {
return (float)zmalloc_get_rss()/zmalloc_used_memory();
}
+
+#if defined(HAVE_PROCFS)
+size_t zmalloc_get_private_dirty(void) {
+ char line[1024];
+ size_t pd = 0;
+ FILE *fp = fopen("/proc/self/smaps","r");
+
+ if (!fp) return 0;
+ while(fgets(line,sizeof(line),fp) != NULL) {
+ if (strncmp(line,"Private_Dirty:",14) == 0) {
+ char *p = strchr(line,'k');
+ if (p) {
+ *p = '\0';
+ pd += strtol(line+14,NULL,10) * 1024;
+ }
+ }
+ }
+ fclose(fp);
+ return pd;
+}
+#else
+size_t zmalloc_get_private_dirty(void) {
+ return 0;
+}
+#endif