update mac zone code
@@ -182,6 +182,72 @@ static malloc_zone_t* mi_get_default_zone()
}
}
+// directly overwrite the default zone as per:
+// <https://lists.apple.com/archives/darwin-dev/2005/Apr/msg00050.html>
+
+static void __attribute__((constructor)) _mi_macos_override_malloc_direct()
+{
+ static malloc_introspection_t intro;
+ memset(&intro, 0, sizeof(intro));
+
+ intro.enumerator = &intro_enumerator;
+ intro.good_size = &intro_good_size;
+ intro.check = &intro_check;
+ intro.print = &intro_print;
+ intro.log = &intro_log;
+ intro.force_lock = &intro_force_lock;
+ intro.force_unlock = &intro_force_unlock;
+
+ static malloc_zone_t oldzone;
+ static malloc_zone_t* zone = malloc_default_zone(); // get the `malloc` backing default zone
+ if (zone == NULL) return;
+
+ // save the default zone in oldzone
+ memset(&oldzone, 0, sizeof(oldzone));
+ if (zone->version >= 9) memcpy(&oldzone, zone, sizeof(oldzone));
+
+ // overwrite default zone functions in-place
+ zone->zone_name = "mimalloc";
+ zone->size = &zone_size;
+ zone->introspect = &intro;
+ zone->malloc = &zone_malloc;
+ zone->calloc = &zone_calloc;
+ zone->valloc = &zone_valloc;
+ zone->free = &zone_free;
+ zone->realloc = &zone_realloc;
+ zone->destroy = &zone_destroy;
+ zone->batch_malloc = &zone_batch_malloc;
+ zone->batch_free = &zone_batch_free;
+
+ malloc_zone_t* purgeable_zone = NULL;
+
+#if defined(MAC_OS_X_VERSION_10_6) && \
+ MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
+ // switch to version 9 on OSX 10.6 to support memalign.
+ // zone->version = 9;
+ zone->memalign = &zone_memalign;
+ zone->free_definite_size = &zone_free_definite_size;
+ zone->pressure_relief = &zone_pressure_relief;
+ intro.zone_locked = &intro_zone_locked;
+ intro.statistics = &intro_statistics;
+ /*
+ // force the purgeable zone to exist to avoid strange bugs
+ if (malloc_default_purgeable_zone) {
+ purgeable_zone = malloc_default_purgeable_zone();
+ }
+ */
+#endif
+ /*
+ // Unregister, and re-register the purgeable_zone to avoid bugs if it occurs
+ // earlier than the default zone.
+ if (purgeable_zone != NULL) {
+ malloc_zone_unregister(purgeable_zone);
+ malloc_zone_register(purgeable_zone);
+ }
+ */
+}
+
+/*
static void __attribute__((constructor)) _mi_macos_override_malloc()
{
static malloc_introspection_t intro;
@@ -248,5 +314,6 @@ static void __attribute__((constructor)) _mi_macos_override_malloc()
}
}
+*/
#endif // MI_MALLOC_OVERRIDE
