* free: * * Free a block of memory allocated by malloc. * * This routine may not block. */
| 864 | * This routine may not block. |
| 865 | */ |
| 866 | void |
| 867 | free(void *addr, struct malloc_type *mtp) |
| 868 | { |
| 869 | uma_zone_t zone; |
| 870 | uma_slab_t slab; |
| 871 | u_long size; |
| 872 | |
| 873 | #ifdef MALLOC_DEBUG |
| 874 | if (free_dbg(&addr, mtp) != 0) |
| 875 | return; |
| 876 | #endif |
| 877 | /* free(NULL, ...) does nothing */ |
| 878 | if (addr == NULL) |
| 879 | return; |
| 880 | |
| 881 | vtozoneslab((vm_offset_t)addr & (~UMA_SLAB_MASK), &zone, &slab); |
| 882 | if (slab == NULL) |
| 883 | panic("free: address %p(%p) has not been allocated.\n", |
| 884 | addr, (void *)((u_long)addr & (~UMA_SLAB_MASK))); |
| 885 | |
| 886 | if (__predict_true(!malloc_large_slab(slab))) { |
| 887 | size = zone->uz_size; |
| 888 | #ifdef INVARIANTS |
| 889 | free_save_type(addr, mtp, size); |
| 890 | #endif |
| 891 | uma_zfree_arg(zone, addr, slab); |
| 892 | } else { |
| 893 | size = malloc_large_size(slab); |
| 894 | free_large(addr, size); |
| 895 | } |
| 896 | malloc_type_freed(mtp, size); |
| 897 | } |
| 898 | |
| 899 | /* |
| 900 | * zfree: |