Add a routine to get the size of the current process
authorBenjamin Kaduk <kaduk@mit.edu>
Fri, 10 Jan 2014 17:33:18 +0000 (12:33 -0500)
committerDerrick Brashear <shadow@your-file-system.com>
Fri, 17 Jan 2014 18:38:14 +0000 (10:38 -0800)
Use rusage when available, and fall back to the very old sbrk(0)
hack otherwise.

Change-Id: Ic986fd6b93476b80008908a95f8b8e0c76d9ed9a
Reviewed-on: http://gerrit.openafs.org/10695
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>

acinclude.m4
src/opr/Makefile.in
src/opr/NTMakefile
src/opr/liboafs_opr.la.sym
src/opr/proc.c [new file with mode: 0644]
src/opr/proc.h [new file with mode: 0644]

index ddb1173..272f0f5 100644 (file)
@@ -1944,6 +1944,11 @@ OPENAFS_HAVE_STRUCT_FIELD(DIR, dd_fd, [#include <sys/types.h>
 #include <dirent.h>
 #endif])
 
+OPENAFS_HAVE_STRUCT_FIELD(struct rusage, ru_idrss,
+[#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/resource.h>
+#endif])
+
 dnl Eventually, this will look for the system one, or for OpenSSL
 LIB_hcrypto="-lafshcrypto"
 LDFLAGS_hcrypto="-L\$(TOP_LIBDIR)"
index b153508..a896dbc 100644 (file)
@@ -3,7 +3,7 @@ include @TOP_OBJDIR@/src/config/Makefile.config
 include @TOP_OBJDIR@/src/config/Makefile.pthread
 include @TOP_OBJDIR@/src/config/Makefile.libtool
 
-LT_objs = assert.lo casestrcpy.lo dict.lo rbtree.lo uuid.lo
+LT_objs = assert.lo casestrcpy.lo dict.lo proc.lo rbtree.lo uuid.lo
 LT_libs = $(LIB_hcrypto) $(LIB_roken)
 
 HEADERS = $(TOP_INCDIR)/afs/opr.h \
@@ -12,6 +12,7 @@ HEADERS = $(TOP_INCDIR)/afs/opr.h \
          $(TOP_INCDIR)/opr/jhash.h \
          $(TOP_INCDIR)/opr/lock.h \
          $(TOP_INCDIR)/opr/lockstub.h \
+         $(TOP_INCDIR)/opr/proc.h \
          $(TOP_INCDIR)/opr/queue.h \
          $(TOP_INCDIR)/opr/rbtree.h \
          $(TOP_INCDIR)/opr/time.h \
@@ -50,6 +51,9 @@ $(TOP_INCDIR)/opr/jhash.h: ${srcdir}/jhash.h
 $(TOP_INCDIR)/opr/lockstub.h: ${srcdir}/lockstub.h
        $(INSTALL_DATA) $? $@
 
+$(TOP_INCDIR)/opr/proc.h: ${srcdir}/proc.h
+       $(INSTALL_DATA) $? $@
+
 $(TOP_INCDIR)/opr/queue.h: ${srcdir}/queue.h
        $(INSTALL_DATA) $? $@
 
index f267dcd..9fc9b09 100644 (file)
@@ -15,6 +15,7 @@ INCFILES = \
        $(INCFILEDIR)\opr_assert.h \
        $(DESTDIR)\include\opr\dict.h \
        $(DESTDIR)\include\opr\jhash.h \
+       $(DESTDIR)\include\opr\proc.h \
        $(DESTDIR)\include\opr\queue.h \
        $(DESTDIR)\include\opr\rbtree.h \
        $(DESTDIR)\include\opr\time.h \
@@ -34,6 +35,7 @@ LIBOBJS = \
        $(OUT)\assert.obj \
        $(OUT)\casestrcpy.obj \
        $(OUT)\dict.obj \
+       $(OUT)\proc.obj \
        $(OUT)\rbtree.obj \
        $(OUT)\uuid.obj \
        $(OUT)\AFS_component_version_number.obj
index cc0466d..d95b316 100644 (file)
@@ -2,6 +2,7 @@ opr_AssertionFailed
 opr_dict_Free
 opr_dict_Init
 opr_lcstring
+opr_procsize
 opr_rbtree_first
 opr_rbtree_init
 opr_rbtree_insert
diff --git a/src/opr/proc.c b/src/opr/proc.c
new file mode 100644 (file)
index 0000000..ede021f
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2014 by the Massachusetts Institute of Technology.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY 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.
+ */
+
+#include <afsconfig.h>
+#include <afs/param.h>
+
+
+#ifndef AFS_NT40_ENV
+#include <unistd.h>
+#endif
+#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/resource.h>
+#endif
+
+/*
+ * Return a measure of the size of the process, in kilobytes.
+ * This is inherently a vague sort of measure, and the different paths
+ * have different actual meanings, but perhaps it is useful for comparing
+ * different logs on the same host.
+ */
+afs_int32
+opr_procsize(void)
+{
+#ifdef AFS_NT40_ENV
+    return -1;
+#elif HAVE_STRUCT_RUSAGE_RU_IDRSS
+    struct rusage usage;
+    if (getrusage(RUSAGE_SELF, &usage) != 0)
+       return -1;
+    else
+       return usage.ru_idrss;
+#else
+    return (int)((long)sbrk(0) >> 10);
+#endif
+}
diff --git a/src/opr/proc.h b/src/opr/proc.h
new file mode 100644 (file)
index 0000000..078c55e
--- /dev/null
@@ -0,0 +1,8 @@
+/* Process information and manipulation tools. */
+
+#ifndef OPENAFS_OPR_PROC_H
+#define OPENAFS_OPR_PROC_H 1
+
+afs_int32 opr_procsize(void);
+
+#endif