Ignore:
File:
1 edited

Legend:

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

    rb60615bd raafed15  
    138138static slab_cache_t *slab_extern_cache;
    139139
     140/** Caches for malloc */
     141static slab_cache_t *malloc_caches[SLAB_MAX_MALLOC_W - SLAB_MIN_MALLOC_W + 1];
     142
     143static 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
    140165/** Slab descriptor */
    141166typedef struct {
     
    750775                panic("Destroying cache that is not empty.");
    751776
    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);
    754780        }
    755781
     
    888914            NULL, NULL, SLAB_CACHE_SLINSIDE | SLAB_CACHE_MAGDEFERRED);
    889915
     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
    890927#ifdef CONFIG_DEBUG
    891928        _slab_initialized = 1;
     
    924961}
    925962
     963void *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
     976void *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
     1003void 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
    9261012/** @}
    9271013 */
Note: See TracChangeset for help on using the changeset viewer.