/** * \brief Initializes the memory pool. * \param[in] pool memory pool * \param[in] mem pool memory * \param[in] mem_size size of pool memory * \param[in] buf_size size of a single buffer * \param[in] num_bufs number of buffers * \return Returns U_SUCC if successful. */ URET uffs_PoolInit(uffs_Pool *pool, void *mem, u32 mem_size, u32 buf_size, u32 num_bufs) { unsigned int i; uffs_PoolEntry *e1, *e2; uffs_Assert(pool, "pool missing"); uffs_Assert(mem, "pool memory missing"); uffs_Assert(num_bufs > 0, "not enough buffers"); uffs_Assert(buf_size % sizeof(void *) == 0, "buffer size not aligned to pointer size"); uffs_Assert(mem_size == num_bufs * buf_size, "pool memory size is wrong"); pool->mem = (u8 *)mem; pool->buf_size = buf_size; pool->num_bufs = num_bufs; pool->sem = uffs_SemCreate(1); uffs_SemWait(pool->sem); // Initialize the free_list e1 = e2 = pool->free_list = (uffs_PoolEntry *) pool->mem; for (i = 1; i < pool->num_bufs; i++) { e2 = (uffs_PoolEntry *) (pool->mem + i * pool->buf_size); e1->next = e2; e1 = e2; } e2->next = NULL; uffs_SemSignal(pool->sem); return U_SUCC; }
/** * \brief Initializes the memory pool. * \param[in] pool memory pool * \param[in] mem pool memory * \param[in] mem_size size of pool memory * \param[in] buf_size size of a single buffer * \param[in] num_bufs number of buffers * \param[in] lock create semaphore for locking the memory pool * \return Returns U_SUCC if successful. */ URET uffs_PoolInit(uffs_Pool *pool, void *mem, u32 mem_size, u32 buf_size, u32 num_bufs, UBOOL lock) { unsigned int i; uffs_PoolEntry *e1, *e2; if (!uffs_Assert(pool != NULL, "pool missing") || !uffs_Assert(mem != NULL, "pool memory missing") || !uffs_Assert(num_bufs > 0, "not enough buffers") || !uffs_Assert(buf_size % sizeof(void *) == 0, "buffer size not aligned to pointer size") || !uffs_Assert(mem_size == num_bufs * buf_size, "pool memory size is wrong")) { return U_FAIL; } pool->mem = (u8 *)mem; pool->buf_size = buf_size; pool->num_bufs = num_bufs; pool->sem = OSSEM_NOT_INITED; if (lock) { uffs_SemCreate(&pool->sem); uffs_SemWait(pool->sem); } // Initialize the free_list e1 = e2 = pool->free_list = (uffs_PoolEntry *) pool->mem; for (i = 1; i < pool->num_bufs; i++) { e2 = (uffs_PoolEntry *) (pool->mem + i * pool->buf_size); e1->next = e2; e1 = e2; } e2->next = NULL; if (lock) uffs_SemSignal(pool->sem); return U_SUCC; }
/* global file system lock */ void uffs_InitGlobalFsLock(void) { uffs_SemCreate(&_global_lock); }
void uffs_DeviceInitLock(uffs_Device *dev) { uffs_SemCreate(&dev->lock.sem); dev->lock.task_id = UFFS_TASK_ID_NOT_EXIST; dev->lock.counter = 0; }