Process Statistics header, add max RSS to render_pdfs

Committed: https://skia.googlesource.com/skia/+/6274baae7fe82ce6481da367687aa6168356e1e1

R=mtklein@google.com

Author: halcanary@google.com

Review URL: https://codereview.chromium.org/448993003
diff --git a/dm/DMReporter.cpp b/dm/DMReporter.cpp
index 14f5087..12bcfac 100644
--- a/dm/DMReporter.cpp
+++ b/dm/DMReporter.cpp
@@ -3,21 +3,7 @@
 #include "SkDynamicAnnotations.h"
 #include "SkCommonFlags.h"
 #include "OverwriteLine.h"
-
-#if defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_ANDROID)
-    #include <sys/resource.h>
-    static long get_max_rss_kb() {
-        struct rusage ru;
-        getrusage(RUSAGE_SELF, &ru);
-    #if defined(SK_BUILD_FOR_MAC)
-        return ru.ru_maxrss / 1024;  // Darwin reports bytes.
-    #else
-        return ru.ru_maxrss;         // Linux reports kilobytes.
-    #endif
-    }
-#else
-    static long get_max_rss_kb() { return 0; }
-#endif
+#include "ProcStats.h"
 
 namespace DM {
 
@@ -36,8 +22,9 @@
         status.appendf(", %d failed", failed);
     }
     if (FLAGS_verbose) {
-        if (long max_rss_kb = get_max_rss_kb()) {
-            status.appendf("\t%4ldM peak", max_rss_kb / 1024);
+        int max_rss_kb = sk_tools::getMaxResidentSetSizeKB();
+        if (max_rss_kb >= 0) {
+            status.appendf("\t%4dM peak", max_rss_kb / 1024);
         }
         status.appendf("\t%5dms\t%s", timeMs, name.c_str());
     }
diff --git a/gyp/apptype_console.gypi b/gyp/apptype_console.gypi
index b993998..53cadf5 100644
--- a/gyp/apptype_console.gypi
+++ b/gyp/apptype_console.gypi
@@ -27,24 +27,32 @@
         'target_conditions': [
           ['_type == "executable"', {
             'mac_bundle' : 1,
+            'sources': [
+              '../src/views/ios/SkOSWindow_iOS.mm',
+              '../src/views/mac/SkEventNotifier.mm',
+              '../experimental/iOSSampleApp/iPad/AppDelegate_iPad.mm',
+              '../experimental/iOSSampleApp/iPhone/AppDelegate_iPhone.mm',
+              '../experimental/iOSSampleApp/Shared/SkUIView.mm',
+              '../experimental/iOSSampleApp/Shared/skia_ios.mm',
+              '../experimental/SimpleiOSApp/SimpleApp.mm',
+            ],
+            'include_dirs' : [
+              '../experimental/iOSSampleApp/Shared',
+              '../include/views',
+              '../include/xml',
+              '../include/utils/mac',
+              '../src/views/mac',
+            ],
+            'xcode_config_file': '../experimental/iOSSampleApp/SkiOSSampleApp-Base.xcconfig',
+            'mac_bundle_resources' : [
+              '../experimental/SimpleiOSApp/iPad/MainWindow_iPad.xib',
+              '../experimental/SimpleiOSApp/iPhone/MainWindow_iPhone.xib',
+            ],
+            'xcode_settings' : {
+              'INFOPLIST_FILE' : '../experimental/SimpleiOSApp/tool-Info.plist',
+            },
           }],
         ],
-        'include_dirs' : [
-          '../experimental/iOSSampleApp/Shared',
-          '../include/views',
-          '../include/xml',
-          '../include/utils/mac',
-          '../src/views/mac',
-        ],
-        'sources': [
-          '../src/views/ios/SkOSWindow_iOS.mm',
-          '../src/views/mac/SkEventNotifier.mm',
-          '../experimental/iOSSampleApp/iPad/AppDelegate_iPad.mm',
-          '../experimental/iOSSampleApp/iPhone/AppDelegate_iPhone.mm',
-          '../experimental/iOSSampleApp/Shared/SkUIView.mm',
-          '../experimental/iOSSampleApp/Shared/skia_ios.mm',
-          '../experimental/SimpleiOSApp/SimpleApp.mm',
-        ],
         'dependencies': [
           'views.gyp:views',
           'xml.gyp:xml',
@@ -59,14 +67,6 @@
             '$(SDKROOT)/System/Library/Frameworks/UIKit.framework',
           ],
         },
-        'xcode_config_file': '../experimental/iOSSampleApp/SkiOSSampleApp-Base.xcconfig',
-        'mac_bundle_resources' : [
-          '../experimental/SimpleiOSApp/iPad/MainWindow_iPad.xib',
-          '../experimental/SimpleiOSApp/iPhone/MainWindow_iPhone.xib',
-        ],
-        'xcode_settings' : {
-          'INFOPLIST_FILE' : '../experimental/SimpleiOSApp/tool-Info.plist',
-        },
       }],
     ],
   },
diff --git a/gyp/dm.gypi b/gyp/dm.gypi
index 92262f3..238c153 100644
--- a/gyp/dm.gypi
+++ b/gyp/dm.gypi
@@ -19,6 +19,7 @@
     'jsoncpp.gyp:jsoncpp',
     'skia_lib.gyp:skia_lib',
     'tools.gyp:crash_handler',
+    'tools.gyp:sk_tool_proc_stats',
     'tools.gyp:sk_tool_utils',
   ],
   'includes': [
diff --git a/gyp/tools.gyp b/gyp/tools.gyp
index f36c523..f4d927c 100644
--- a/gyp/tools.gyp
+++ b/gyp/tools.gyp
@@ -530,6 +530,7 @@
         'pdf.gyp:pdf',
         'skia_lib.gyp:skia_lib',
         'tools.gyp:picture_utils',
+        'tools.gyp:sk_tool_proc_stats',
       ],
       'conditions': [
         ['skia_win_debuggers_path and skia_os == "win"',
@@ -646,6 +647,17 @@
         'skia_lib.gyp:skia_lib',
       ],
     },
+    {
+      'target_name': 'sk_tool_proc_stats',
+      'type': 'static_library',
+      'sources': [
+        '../tools/ProcStats.h',
+        '../tools/ProcStats.cpp',
+      ],
+      'direct_dependent_settings': {
+        'include_dirs': [ '../tools', ],
+      },
+    },
   ],
   'conditions': [
     ['skia_shared_lib',
diff --git a/tools/ProcStats.cpp b/tools/ProcStats.cpp
new file mode 100644
index 0000000..9466039
--- /dev/null
+++ b/tools/ProcStats.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "ProcStats.h"
+
+#if defined(SK_BUILD_FOR_UNIX) || \
+    defined(SK_BUILD_FOR_MAC) || \
+    defined(SK_BUILD_FOR_ANDROID)
+
+    #include <sys/resource.h>
+    int sk_tools::getMaxResidentSetSizeKB() {
+        struct rusage ru;
+        getrusage(RUSAGE_SELF, &ru);
+    #if defined(SK_BUILD_FOR_MAC)
+        return static_cast<int>(ru.ru_maxrss / 1024);  // Darwin reports bytes.
+    #else
+        return static_cast<int>(ru.ru_maxrss);  // Linux reports kilobytes.
+    #endif
+    }
+
+#else
+
+    int sk_tools::getMaxResidentSetSizeKB() {
+        return -1;
+    }
+
+#endif
diff --git a/tools/ProcStats.h b/tools/ProcStats.h
new file mode 100644
index 0000000..42849f1
--- /dev/null
+++ b/tools/ProcStats.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2014 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef ProcStats_DEFINED
+#define ProcStats_DEFINED
+
+/**
+ * ProcStats - Process Statistics Functions
+ */
+
+namespace sk_tools {
+
+/**
+ *  If not implemented for this OS, returns -1.  Otherwise, return
+ *  the maximum resident set size, as reported by getrusage().
+ */
+int getMaxResidentSetSizeKB();
+
+}  // namespace sk_tools
+
+#endif  // ProcStats_DEFINED
diff --git a/tools/render_pdfs_main.cpp b/tools/render_pdfs_main.cpp
index be29439..34e5e58 100644
--- a/tools/render_pdfs_main.cpp
+++ b/tools/render_pdfs_main.cpp
@@ -18,6 +18,7 @@
 #include "SkTArray.h"
 #include "SkTSort.h"
 #include "PdfRenderer.h"
+#include "ProcStats.h"
 #include "picture_utils.h"
 
 __SK_FORCE_IMAGE_DECODER_LINKING;
@@ -219,7 +220,9 @@
             }
         }
     }
-    SkTQSort<SkString>(files.begin(), files.end() - 1);
+    if (files.count() > 0) {
+        SkTQSort<SkString>(files.begin(), files.end() - 1);
+    }
     int failures = 0;
     for (int i = 0; i < files.count(); i ++) {
         if (!render_pdf(files[i], outputDir, renderer)) {
@@ -246,6 +249,11 @@
 
     int failures = process_input(FLAGS_inputPaths, outputDir, *renderer);
 
+    int max_rss_kb = sk_tools::getMaxResidentSetSizeKB();
+    if (max_rss_kb >= 0) {
+        SkDebugf("%4dM peak ResidentSetSize\n", max_rss_kb / 1024);
+    }
+
     if (failures != 0) {
         SkDebugf("Failed to render %i PDFs.\n", failures);
         return 1;