#import "YSZone.h" static YSZone *zone_list = 0; static void *default_malloc(YSZone *zone, size_t size) { void *mem; mem = malloc(size); if (mem != NULL) { return mem; } //raise oom exception return 0; } static void default_free(YSZone *zone, void *ptr) { free(ptr); } static YSZone default_zone = { default_malloc, default_free, }; YSZone *YSDefaultMallocZone(void) { return &default_zone; } YSZone *YSZoneFromPointer(void *ptr) { YSZone *zone; if (ptr == 0) return 0; if (zone_list == 0) return &default_zone; //mutex lock for (zone = zone_list; zone != 0; zone = zone->next) { if ( (zone->lookup)(zone, ptr) == 1 ) { break; } } //mutex unlock return (zone == 0) ? &default_zone : zone; } void *YSZoneMalloc(YSZone *zone, YSUInteger size) { if (!zone) { zone = YSDefaultMallocZone(); } return (zone->malloc)(zone, size); }