Mercurial > flash_v2
diff packages/fs/jffs2/current/src/malloc-ecos.c @ 1373:00a9f2cb1081
* cdl/jffs2.cdl:
* src/malloc-ecos.c:
* src/fs-ecos.c: Allocate jffs2_raw_node_ref structs
from pool or malloc depending on a CDL configuration.
| author | asl |
|---|---|
| date | Thu, 20 Nov 2003 21:06:25 +0000 |
| parents | a7947d436e85 |
| children | cd7d2afbc7dd |
line wrap: on
line diff
--- a/packages/fs/jffs2/current/src/malloc-ecos.c +++ b/packages/fs/jffs2/current/src/malloc-ecos.c @@ -12,8 +12,13 @@ */ #include <linux/kernel.h> +#include <cyg/hal/drv_api.h> #include "nodelist.h" +#if !defined(CYGNUM_FS_JFFS2_RAW_NODE_REF_CACHE_POOL_SIZE) +# define CYGNUM_FS_JFFS2_RAW_NODE_REF_CACHE_POOL_SIZE 0 +#endif + struct jffs2_full_dirent *jffs2_alloc_full_dirent(int namesize) { return malloc(sizeof(struct jffs2_full_dirent) + namesize); @@ -64,6 +69,27 @@ void jffs2_free_tmp_dnode_info(struct jf free(x); } +struct jffs2_node_frag *jffs2_alloc_node_frag(void) +{ + return malloc(sizeof(struct jffs2_node_frag)); +} + +void jffs2_free_node_frag(struct jffs2_node_frag *x) +{ + free(x); +} + +#if CYGNUM_FS_JFFS2_RAW_NODE_REF_CACHE_POOL_SIZE == 0 + +int jffs2_create_slab_caches(void) +{ + return 0; +} + +void jffs2_destroy_slab_caches(void) +{ +} + struct jffs2_raw_node_ref *jffs2_alloc_raw_node_ref(void) { return malloc(sizeof(struct jffs2_raw_node_ref)); @@ -74,16 +100,54 @@ void jffs2_free_raw_node_ref(struct jffs free(x); } -struct jffs2_node_frag *jffs2_alloc_node_frag(void) +#else // CYGNUM_FS_JFFS2_RAW_NODE_REF_CACHE_POOL_SIZE == 0 + +static struct jffs2_raw_node_ref + rnr_pool[CYGNUM_FS_JFFS2_RAW_NODE_REF_CACHE_POOL_SIZE] __attribute__ ((aligned (4))), + * first = NULL; +static cyg_drv_mutex_t mutex; + +int jffs2_create_slab_caches(void) { - return malloc(sizeof(struct jffs2_node_frag)); + struct jffs2_raw_node_ref * p; + cyg_drv_mutex_init(&mutex); + for ( + p = rnr_pool; + p < rnr_pool + CYGNUM_FS_JFFS2_RAW_NODE_REF_CACHE_POOL_SIZE - 1; + p++ + ) + p->next_phys = p + 1; + rnr_pool[CYGNUM_FS_JFFS2_RAW_NODE_REF_CACHE_POOL_SIZE - 1].next_phys = NULL; + first = &rnr_pool[0]; + return 0; } -void jffs2_free_node_frag(struct jffs2_node_frag *x) +void jffs2_destroy_slab_caches(void) +{ +} + +struct jffs2_raw_node_ref *jffs2_alloc_raw_node_ref(void) { - free(x); + struct jffs2_raw_node_ref * p; + + cyg_drv_mutex_lock(&mutex); + p = first; + if (p != NULL) + first = p->next_phys; + cyg_drv_mutex_unlock(&mutex); + return p; } +void jffs2_free_raw_node_ref(struct jffs2_raw_node_ref *x) +{ + cyg_drv_mutex_lock(&mutex); + x->next_phys = first; + first = x; + cyg_drv_mutex_unlock(&mutex); +} + +#endif // CYGNUM_FS_JFFS2_RAW_NODE_REF_CACHE_POOL_SIZE == 0 + struct jffs2_inode_cache *jffs2_alloc_inode_cache(void) { struct jffs2_inode_cache *ret = malloc(sizeof(struct jffs2_inode_cache));
