00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <l4/dde/ddekit/memory.h>
00019 #include <l4/dde/ddekit/printf.h>
00020 #include <l4/dde/ddekit/panic.h>
00021
00022 #include <l4/sys/consts.h>
00023 #include <l4/util/list_alloc.h>
00024 #include <l4/dm_mem/dm_mem.h>
00025 #include <l4/lock/lock.h>
00026
00027
00028 #define ALLOC_SIZE (4 * L4_PAGESIZE)
00029
00030
00031 static l4la_free_t *malloc_pool;
00032 static l4lock_t malloc_lock = L4LOCK_UNLOCKED;
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 void *ddekit_simple_malloc(unsigned size)
00047 {
00048 l4lock_lock(&malloc_lock);
00049
00050 size += sizeof(unsigned);
00051
00052
00053 unsigned *p = l4la_alloc(&malloc_pool, size, 0);
00054
00055
00056 if (!p) {
00057
00058 unsigned ds_size = l4_round_page(size);
00059 ds_size = (ds_size > ALLOC_SIZE) ? ds_size : ALLOC_SIZE;
00060
00061 void *res = l4dm_mem_allocate_named(ds_size, L4RM_MAP, "ddekit malloc");
00062 if (!res)
00063 p = NULL;
00064 else
00065 {
00066 l4la_free(&malloc_pool, res, ds_size);
00067 p = l4la_alloc(&malloc_pool, size, 0);
00068 }
00069 }
00070
00071
00072 if (p) {
00073 *p = size;
00074 p++;
00075 }
00076
00077 l4lock_unlock(&malloc_lock);
00078 return p;
00079 }
00080
00081
00082
00083
00084
00085
00086
00087 void ddekit_simple_free(void *p)
00088 {
00089 l4lock_lock(&malloc_lock);
00090 unsigned *chunk = (unsigned *)p - 1;
00091 if (p)
00092 l4la_free(&malloc_pool, chunk, *chunk);
00093 l4lock_unlock(&malloc_lock);
00094 }