Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/slab.c

    raafed15 rb60615b  
    138138static slab_cache_t *slab_extern_cache;
    139139
    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 
    165140/** Slab descriptor */
    166141typedef struct {
     
    775750                panic("Destroying cache that is not empty.");
    776751
    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);
     752        if (!(cache->flags & SLAB_CACHE_NOMAGAZINE) && cache->mag_cache) {
     753                slab_free(&slab_mag_cache, cache->mag_cache);
    780754        }
    781755
     
    914888            NULL, NULL, SLAB_CACHE_SLINSIDE | SLAB_CACHE_MAGDEFERRED);
    915889
    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 
    927890#ifdef CONFIG_DEBUG
    928891        _slab_initialized = 1;
     
    961924}
    962925
    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 
    1012926/** @}
    1013927 */
Note: See TracChangeset for help on using the changeset viewer.