Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Fix for rust-lang/rust#34674 #15

Merged
merged 2 commits into from
Jul 8, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 31 additions & 3 deletions src/zone.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,33 @@ zone_force_unlock(malloc_zone_t *zone)
jemalloc_postfork_parent();
}

static malloc_zone_t *get_default_zone()
{
malloc_zone_t **zones = NULL;
unsigned int num_zones = 0;

/*
* On OSX 10.12, malloc_default_zone returns a special zone that is not
* present in the list of registered zones. That zone uses a "lite zone"
* if one is present (apparently enabled when malloc stack logging is
* enabled), or the first registered zone otherwise. In practice this
* means unless malloc stack logging is enabled, the first registered
* zone is the default.
* So get the list of zones to get the first one, instead of relying on
* malloc_default_zone.
*/
if (KERN_SUCCESS != malloc_get_all_zones(0, NULL, (vm_address_t**) &zones,
&num_zones)) {
/* Reset the value in case the failure happened after it was set. */
num_zones = 0;
}

if (num_zones)
return zones[0];

return malloc_default_zone();
}

JEMALLOC_ATTR(constructor)
void
register_zone(void)
Expand All @@ -177,7 +204,7 @@ register_zone(void)
* If something else replaced the system default zone allocator, don't
* register jemalloc's.
*/
malloc_zone_t *default_zone = malloc_default_zone();
malloc_zone_t *default_zone = get_default_zone();
malloc_zone_t *purgeable_zone = NULL;
if (!default_zone->zone_name ||
strcmp(default_zone->zone_name, "DefaultMallocZone") != 0) {
Expand Down Expand Up @@ -246,7 +273,6 @@ register_zone(void)
malloc_zone_register(&zone);

do {
default_zone = malloc_default_zone();
/*
* Unregister and reregister the default zone. On OSX >= 10.6,
* unregistering takes the last registered zone and places it
Expand All @@ -272,5 +298,7 @@ register_zone(void)
malloc_zone_unregister(purgeable_zone);
malloc_zone_register(purgeable_zone);
}
} while (malloc_default_zone() != &zone);

default_zone = get_default_zone();
} while (default_zone != &zone);
}