Wasm: Any function argument of type Void should be a validation error
authorsbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 26 Jun 2018 07:38:06 +0000 (07:38 +0000)
committersbarati@apple.com <sbarati@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 26 Jun 2018 07:38:06 +0000 (07:38 +0000)
https://bugs.webkit.org/show_bug.cgi?id=186794
<rdar://problem/41140257>

Reviewed by Keith Miller.

We have evidence showing that processes with small heaps using the
JS API are more space efficient when using system malloc. Our main
hypothesis as to why this is, is that when dealing with small heaps,
one malloc can be more efficient at optimizing memory usage than
two mallocs.

* bmalloc/BPlatform.h:
* bmalloc/Environment.cpp:
(bmalloc::isNanoMallocEnabled):
(bmalloc::Environment::computeIsDebugHeapEnabled):
* bmalloc/ProcessCheck.h:
(bmalloc::shouldProcessUnconditionallyUseBmalloc):
* bmalloc/ProcessCheck.mm:
(bmalloc::shouldProcessUnconditionallyUseBmalloc):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233192 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/BPlatform.h
Source/bmalloc/bmalloc/Environment.cpp
Source/bmalloc/bmalloc/ProcessCheck.h
Source/bmalloc/bmalloc/ProcessCheck.mm

index c6e6ab4..126c6aa 100644 (file)
@@ -1,3 +1,26 @@
+2018-06-26  Saam Barati  <sbarati@apple.com>
+
+        Wasm: Any function argument of type Void should be a validation error
+        https://bugs.webkit.org/show_bug.cgi?id=186794
+        <rdar://problem/41140257>
+
+        Reviewed by Keith Miller.
+
+        We have evidence showing that processes with small heaps using the
+        JS API are more space efficient when using system malloc. Our main
+        hypothesis as to why this is, is that when dealing with small heaps,
+        one malloc can be more efficient at optimizing memory usage than
+        two mallocs.
+
+        * bmalloc/BPlatform.h:
+        * bmalloc/Environment.cpp:
+        (bmalloc::isNanoMallocEnabled):
+        (bmalloc::Environment::computeIsDebugHeapEnabled):
+        * bmalloc/ProcessCheck.h:
+        (bmalloc::shouldProcessUnconditionallyUseBmalloc):
+        * bmalloc/ProcessCheck.mm:
+        (bmalloc::shouldProcessUnconditionallyUseBmalloc):
+
 2018-06-24  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         [bmalloc][Linux] Remove static initializers for PerProcess<>::s_object
index 39516ac..d904dc1 100644 (file)
 #define BPLATFORM_WATCHOS 1
 #endif
 
+#if defined(TARGET_OS_TV) && TARGET_OS_TV
+#define BPLATFORM_APPLETV 1
+#endif
+
 /* ==== Policy decision macros: these define policy choices for a particular port. ==== */
 
 /* BUSE() - use a particular third-party library or optional OS service */
 
 /* This is used for debugging when hacking on how bmalloc calculates its physical footprint. */
 #define ENABLE_PHYSICAL_PAGE_MAP 0
+
+#if ((BPLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 120000) || (BPLATFORM(WATCHOS) && __WATCH_OS_VERSION_MIN_REQUIRED >= 50000) || (BPLATFORM(APPLETV) && __TV_OS_VERSION_MIN_REQUIRED >= 120000)) \
+    && (BCPU(ARM64) || BCPU(ARM))
+#define BUSE_CHECK_NANO_MALLOC 1
+#else
+#define BUSE_CHECK_NANO_MALLOC 0
+#endif
+
index 0bd833f..81f7c71 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "BPlatform.h"
 #include "Environment.h"
+#include "ProcessCheck.h"
 #include <cstdlib>
 #include <cstring>
 #if BOS(DARWIN)
 #include <dlfcn.h>
 #endif
 
+#if BUSE(CHECK_NANO_MALLOC)
+extern "C" {
+#if __has_include(<malloc_private.h>)
+#include <malloc_private.h>
+#endif
+int malloc_engaged_nano(void);
+}
+#endif
+
 namespace bmalloc {
 
 static bool isMallocEnvironmentVariableSet()
@@ -107,6 +117,14 @@ static bool isSanitizerEnabled()
 #endif
 }
 
+#if BUSE(CHECK_NANO_MALLOC)
+static bool isNanoMallocEnabled()
+{
+    int result = !!malloc_engaged_nano();
+    return result;
+}
+#endif
+
 Environment::Environment(std::lock_guard<Mutex>&)
     : m_isDebugHeapEnabled(computeIsDebugHeapEnabled())
 {
@@ -120,6 +138,10 @@ bool Environment::computeIsDebugHeapEnabled()
         return true;
     if (isSanitizerEnabled())
         return true;
+#if BUSE(CHECK_NANO_MALLOC)
+    if (!isNanoMallocEnabled() && !shouldProcessUnconditionallyUseBmalloc())
+        return true;
+#endif
     return false;
 }
 
index dda891c..36b5c26 100644 (file)
@@ -39,4 +39,10 @@ bool gigacageEnabledForProcess();
 inline bool gigacageEnabledForProcess() { return true; }
 #endif
 
+#if BUSE(CHECK_NANO_MALLOC)
+bool shouldProcessUnconditionallyUseBmalloc();
+#else
+inline bool shouldProcessUnconditionallyUseBmalloc() { return true; }
+#endif
+
 }
index c55c9d1..d85a8db 100644 (file)
@@ -28,6 +28,7 @@
 #if !BPLATFORM(WATCHOS)
 
 #import <Foundation/Foundation.h>
+#import <mutex>
 
 namespace bmalloc {
 
@@ -52,6 +53,27 @@ bool gigacageEnabledForProcess()
     return isOptInBinary;
 }
 
+#if BUSE(CHECK_NANO_MALLOC)
+bool shouldProcessUnconditionallyUseBmalloc()
+{
+    static bool result;
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [&] () {
+        if (NSString *appName = [[NSBundle mainBundle] bundleIdentifier]) {
+            auto contains = [&] (NSString *string) {
+                return [appName rangeOfString:string options:NSCaseInsensitiveSearch].location != NSNotFound;
+            };
+            result = contains(@"com.apple.WebKit") || contains(@"safari");
+        } else {
+            NSString *processName = [[NSProcessInfo processInfo] processName];
+            result = [processName isEqualToString:@"jsc"] || [processName isEqualToString:@"wasm"];
+        }
+    });
+
+    return result;
+}
+#endif
+
 }
 
 #endif