Changes in kernel/generic/src/mm/slab.c [b60615bd:aafed15] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/slab.c
rb60615bd raafed15 138 138 static slab_cache_t *slab_extern_cache; 139 139 140 /** Caches for malloc */ 141 static slab_cache_t *malloc_caches[SLAB_MAX_MALLOC_W - SLAB_MIN_MALLOC_W + 1]; 142 143 static const char *malloc_names[] = { 144 "malloc-16", 145 "malloc-32", 146 "malloc-64", 147 "malloc-128", 148 "malloc-256", 149 "malloc-512", 150 "malloc-1K", 151 "malloc-2K", 152 "malloc-4K", 153 "malloc-8K", 154 "malloc-16K", 155 "malloc-32K", 156 "malloc-64K", 157 "malloc-128K", 158 "malloc-256K", 159 "malloc-512K", 160 "malloc-1M", 161 "malloc-2M", 162 "malloc-4M" 163 }; 164 140 165 /** Slab descriptor */ 141 166 typedef struct { … … 750 775 panic("Destroying cache that is not empty."); 751 776 752 if (!(cache->flags & SLAB_CACHE_NOMAGAZINE) && cache->mag_cache) { 753 slab_free(&slab_mag_cache, cache->mag_cache); 777 if (!(cache->flags & SLAB_CACHE_NOMAGAZINE)) { 778 slab_t *mag_slab = obj2slab(cache->mag_cache); 779 _slab_free(mag_slab->cache, cache->mag_cache, mag_slab); 754 780 } 755 781 … … 888 914 NULL, NULL, SLAB_CACHE_SLINSIDE | SLAB_CACHE_MAGDEFERRED); 889 915 916 /* Initialize structures for malloc */ 917 size_t i; 918 size_t size; 919 920 for (i = 0, size = (1 << SLAB_MIN_MALLOC_W); 921 i < (SLAB_MAX_MALLOC_W - SLAB_MIN_MALLOC_W + 1); 922 i++, size <<= 1) { 923 malloc_caches[i] = slab_cache_create(malloc_names[i], size, 0, 924 NULL, NULL, SLAB_CACHE_MAGDEFERRED); 925 } 926 890 927 #ifdef CONFIG_DEBUG 891 928 _slab_initialized = 1; … … 924 961 } 925 962 963 void *malloc(size_t size) 964 { 965 assert(_slab_initialized); 966 assert(size <= (1 << SLAB_MAX_MALLOC_W)); 967 968 if (size < (1 << SLAB_MIN_MALLOC_W)) 969 size = (1 << SLAB_MIN_MALLOC_W); 970 971 uint8_t idx = fnzb(size - 1) - SLAB_MIN_MALLOC_W + 1; 972 973 return slab_alloc(malloc_caches[idx], FRAME_ATOMIC); 974 } 975 976 void *realloc(void *ptr, size_t size) 977 { 978 assert(_slab_initialized); 979 assert(size <= (1 << SLAB_MAX_MALLOC_W)); 980 981 void *new_ptr; 982 983 if (size > 0) { 984 if (size < (1 << SLAB_MIN_MALLOC_W)) 985 size = (1 << SLAB_MIN_MALLOC_W); 986 uint8_t idx = fnzb(size - 1) - SLAB_MIN_MALLOC_W + 1; 987 988 new_ptr = slab_alloc(malloc_caches[idx], FRAME_ATOMIC); 989 } else 990 new_ptr = NULL; 991 992 if ((new_ptr != NULL) && (ptr != NULL)) { 993 slab_t *slab = obj2slab(ptr); 994 memcpy(new_ptr, ptr, min(size, slab->cache->size)); 995 } 996 997 if (ptr != NULL) 998 free(ptr); 999 1000 return new_ptr; 1001 } 1002 1003 void free(void *ptr) 1004 { 1005 if (!ptr) 1006 return; 1007 1008 slab_t *slab = obj2slab(ptr); 1009 _slab_free(slab->cache, ptr, slab); 1010 } 1011 926 1012 /** @} 927 1013 */
Note:
See TracChangeset
for help on using the changeset viewer.