bmalloc: Added missing features to the malloc zone introspection API
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Mar 2015 22:45:59 +0000 (22:45 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Mar 2015 22:45:59 +0000 (22:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=142235

Reviewed by Andreas Kling.

This should fix the crash we saw on the iOS PLT bot
(c.f. http://trac.webkit.org/changeset/180604).

* bmalloc/Zone.cpp:
(bmalloc::good_size):
(bmalloc::check):
(bmalloc::print):
(bmalloc::log):
(bmalloc::force_lock):
(bmalloc::force_unlock):
(bmalloc::statistics):
(bmalloc::size):
(bmalloc::enumerator): Provide all of these functions since they are called
indiscriminately on all zones.

(bmalloc::Zone::Zone):
(bmalloc::Zone::size): Deleted.
(bmalloc::Zone::enumerator): Deleted. Moved these functions out of the
Zone class since they can stand alone.

* bmalloc/Zone.h:

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

Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc/Zone.cpp
Source/bmalloc/bmalloc/Zone.h

index b071244..501a8d7 100644 (file)
@@ -1,5 +1,34 @@
 2015-03-03  Geoffrey Garen  <ggaren@apple.com>
 
+        bmalloc: Added missing features to the malloc zone introspection API
+        https://bugs.webkit.org/show_bug.cgi?id=142235
+
+        Reviewed by Andreas Kling.
+
+        This should fix the crash we saw on the iOS PLT bot
+        (c.f. http://trac.webkit.org/changeset/180604).
+
+        * bmalloc/Zone.cpp:
+        (bmalloc::good_size):
+        (bmalloc::check):
+        (bmalloc::print):
+        (bmalloc::log):
+        (bmalloc::force_lock):
+        (bmalloc::force_unlock):
+        (bmalloc::statistics):
+        (bmalloc::size):
+        (bmalloc::enumerator): Provide all of these functions since they are called
+        indiscriminately on all zones.
+
+        (bmalloc::Zone::Zone):
+        (bmalloc::Zone::size): Deleted.
+        (bmalloc::Zone::enumerator): Deleted. Moved these functions out of the
+        Zone class since they can stand alone.
+
+        * bmalloc/Zone.h:
+
+2015-03-03  Geoffrey Garen  <ggaren@apple.com>
+
         bmalloc should implement malloc introspection (to stop false-positive leaks when MallocStackLogging is off)
         https://bugs.webkit.org/show_bug.cgi?id=141802
 
index 9cfa715..5d5c924 100644 (file)
 
 namespace bmalloc {
 
-// The memory analysis API requires the contents of this struct to be a static
-// constant in the program binary. The leaks process will load this struct
-// out of the program binary (and not out of the running process).
-static malloc_introspection_t introspect = {
-    .enumerator = Zone::enumerator
-};
-
 template<typename T> static void remoteRead(task_t task, memory_reader_t reader, vm_address_t pointer, T& result)
 {
     void* tmp;
@@ -42,15 +35,49 @@ template<typename T> static void remoteRead(task_t task, memory_reader_t reader,
     memcpy(&result, tmp, sizeof(T));
 }
 
-// Support malloc_zone_from_ptr, which calls size() on each registered zone.
-size_t Zone::size(malloc_zone_t*, const void*)
+// These function pointers are invoked unconditionally on all zones by various
+// system tools. We don't support any of these features, but we provide
+// just enough functionality not to crash.
+
+static size_t good_size(malloc_zone_t*, size_t size)
+{
+    return size;
+}
+
+static boolean_t check(malloc_zone_t*)
+{
+    return true;
+}
+
+static void print(malloc_zone_t*, boolean_t)
+{
+}
+
+static void log(malloc_zone_t*, void*)
+{
+}
+
+static void force_lock(malloc_zone_t*)
+{
+}
+
+static void force_unlock(malloc_zone_t*)
+{
+}
+
+static void statistics(malloc_zone_t*, malloc_statistics_t* statistics)
+{
+    memset(statistics, 0, sizeof(malloc_statistics_t));
+}
+
+static size_t size(malloc_zone_t*, const void*)
 {
     // Our zone is not public API, so no pointer can belong to us.
     return 0;
 }
 
 // This function runs inside the leaks process.
-kern_return_t Zone::enumerator(task_t task, void* context, unsigned type_mask, vm_address_t zone_address, memory_reader_t reader, vm_range_recorder_t recorder)
+static kern_return_t enumerator(task_t task, void* context, unsigned type_mask, vm_address_t zone_address, memory_reader_t reader, vm_range_recorder_t recorder)
 {
     Zone remoteZone;
     remoteRead(task, reader, zone_address, remoteZone);
@@ -68,9 +95,23 @@ kern_return_t Zone::enumerator(task_t task, void* context, unsigned type_mask, v
     return 0;
 }
 
+// The memory analysis API requires the contents of this struct to be a static
+// constant in the program binary. The leaks process will load this struct
+// out of the program binary (and not out of the running process).
+static malloc_introspection_t introspect = {
+    .enumerator = bmalloc::enumerator,
+    .good_size = bmalloc::good_size,
+    .check = bmalloc::check,
+    .print = bmalloc::print,
+    .log = bmalloc::log,
+    .force_lock = bmalloc::force_lock,
+    .force_unlock = bmalloc::force_unlock,
+    .statistics = bmalloc::statistics
+};
+
 Zone::Zone()
 {
-    malloc_zone_t::size = size;
+    malloc_zone_t::size = &bmalloc::size;
     malloc_zone_t::zone_name = "WebKit Malloc";
     malloc_zone_t::introspect = &bmalloc::introspect;
     malloc_zone_t::version = 4;
index 4fe496e..a89f0c6 100644 (file)
@@ -38,9 +38,6 @@ public:
     // Enough capacity to track a 64GB heap, so probably enough for anything.
     static const size_t capacity = 2048;
 
-    static size_t size(malloc_zone_t*, const void*);
-    static kern_return_t enumerator(task_t, void* context, unsigned type_mask, vm_address_t, memory_reader_t, vm_range_recorder_t);
-
     Zone();
 
     void addSuperChunk(SuperChunk*);