1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
   | #define MALLOC_ZONE_FN_PTR(fn) __ptrauth(ptrauth_key_process_independent_code, \ 		FALSE, ptrauth_string_discriminator("malloc_zone_fn." #fn)) fn
  typedef struct _malloc_zone_t {     /* Only zone implementors should depend on the layout of this structure;     Regular callers should use the access functions below */     void	*reserved1;	/* RESERVED FOR CFAllocator DO NOT USE */     void	*reserved2;	/* RESERVED FOR CFAllocator DO NOT USE */     size_t 	(* MALLOC_ZONE_FN_PTR(size))(struct _malloc_zone_t *zone, const void *ptr); /* returns the size of a block or 0 if not in this zone; must be fast, especially for negative answers */     void 	*(* MALLOC_ZONE_FN_PTR(malloc))(struct _malloc_zone_t *zone, size_t size);     void 	*(* MALLOC_ZONE_FN_PTR(calloc))(struct _malloc_zone_t *zone, size_t num_items, size_t size); /* same as malloc, but block returned is set to zero */     void 	*(* MALLOC_ZONE_FN_PTR(valloc))(struct _malloc_zone_t *zone, size_t size); /* same as malloc, but block returned is set to zero and is guaranteed to be page aligned */     void 	(* MALLOC_ZONE_FN_PTR(free))(struct _malloc_zone_t *zone, void *ptr);     void 	*(* MALLOC_ZONE_FN_PTR(realloc))(struct _malloc_zone_t *zone, void *ptr, size_t size);     void 	(* MALLOC_ZONE_FN_PTR(destroy))(struct _malloc_zone_t *zone); /* zone is destroyed and all memory reclaimed */     const char	*zone_name;
      /* Optional batch callbacks; these may be NULL */     unsigned	(* MALLOC_ZONE_FN_PTR(batch_malloc))(struct _malloc_zone_t *zone, size_t size, void **results, unsigned num_requested); /* given a size, returns pointers capable of holding that size; returns the number of pointers allocated (maybe 0 or less than num_requested) */     void	(* MALLOC_ZONE_FN_PTR(batch_free))(struct _malloc_zone_t *zone, void **to_be_freed, unsigned num_to_be_freed); /* frees all the pointers in to_be_freed; note that to_be_freed may be overwritten during the process */
      struct malloc_introspection_t	* MALLOC_INTROSPECT_TBL_PTR(introspect);     unsigned	version;     	     /* aligned memory allocation. The callback may be NULL. Present in version >= 5. */     void *(* MALLOC_ZONE_FN_PTR(memalign))(struct _malloc_zone_t *zone, size_t alignment, size_t size);          /* free a pointer known to be in zone and known to have the given size. The callback may be NULL. Present in version >= 6.*/     void (* MALLOC_ZONE_FN_PTR(free_definite_size))(struct _malloc_zone_t *zone, void *ptr, size_t size);
      /* Empty out caches in the face of memory pressure. The callback may be NULL. Present in version >= 8. */     size_t 	(* MALLOC_ZONE_FN_PTR(pressure_relief))(struct _malloc_zone_t *zone, size_t goal);
  	/* 	 * Checks whether an address might belong to the zone. May be NULL. Present in version >= 10. 	 * False positives are allowed (e.g. the pointer was freed, or it's in zone space that has 	 * not yet been allocated. False negatives are not allowed. 	 */     boolean_t (* MALLOC_ZONE_FN_PTR(claimed_address))(struct _malloc_zone_t *zone, void *ptr); } malloc_zone_t;
   |