A_STATUS a_mutex_init(A_MUTEX_T *pMutex) { assert(pMutex); krhino_mutex_create(pMutex, "mutex"); if (NULL == pMutex) { return A_ERROR; } else { return A_OK; } }
int aos_mutex_new(aos_mutex_t *mutex) { kstat_t ret; kmutex_t *m; if (mutex == NULL) { return -EINVAL; } m = aos_malloc(sizeof(kmutex_t)); if (m == NULL) { return -ENOMEM; } ret = krhino_mutex_create(m, "AOS"); if (ret != RHINO_SUCCESS) { aos_free(m); ERRNO_MAPPING(ret); } mutex->hdl = m; return 0; }
kstat_t krhino_init_mm_head(k_mm_head **ppmmhead, void *addr, size_t len ) { k_mm_list_t *nextblk; k_mm_list_t *firstblk; k_mm_head *pmmhead; void *orig_addr; #if (RHINO_CONFIG_MM_BLK > 0) mblk_pool_t *mmblk_pool; kstat_t stat; #endif NULL_PARA_CHK(ppmmhead); NULL_PARA_CHK(addr); /*check paramters, addr and len need algin 1. the length at least need RHINO_CONFIG_MM_TLF_BLK_SIZE for fixed size memory block 2. and also ast least have 1k for user alloced */ orig_addr = addr; addr = (void *) MM_ALIGN_UP((size_t)addr); len -= (size_t)addr - (size_t)orig_addr; len = MM_ALIGN_DOWN(len); if ( len == 0 || len < MIN_FREE_MEMORY_SIZE + RHINO_CONFIG_MM_TLF_BLK_SIZE || len > MM_MAX_SIZE) { return RHINO_MM_POOL_SIZE_ERR; } pmmhead = (k_mm_head *)addr; /* Zeroing the memory head */ memset(pmmhead, 0, sizeof(k_mm_head)); #if (RHINO_CONFIG_MM_REGION_MUTEX > 0) krhino_mutex_create(&pmmhead->mm_mutex, "mm_mutex"); #else krhino_spin_lock_init(&pmmhead->mm_lock); #endif firstblk = init_mm_region((void *)((size_t)addr + MM_ALIGN_UP(sizeof(k_mm_head))), MM_ALIGN_DOWN(len - sizeof(k_mm_head))); pmmhead->regioninfo = (k_mm_region_info_t *)firstblk->mbinfo.buffer; nextblk = MM_GET_NEXT_BLK(firstblk); *ppmmhead = pmmhead; /*mark it as free and set it to bitmap*/ #if (RHINO_CONFIG_MM_DEBUG > 0u) nextblk->dye = RHINO_MM_CORRUPT_DYE; nextblk->owner = 0; #endif /* release free blk */ k_mm_free(pmmhead, nextblk->mbinfo.buffer); /*after free, we need acess mmhead and nextblk again*/ #if (K_MM_STATISTIC > 0) pmmhead->free_size = MM_GET_BUF_SIZE(nextblk); pmmhead->used_size = len - MM_GET_BUF_SIZE(nextblk); pmmhead->maxused_size = pmmhead->used_size; #endif /* default no fixblk */ pmmhead->fix_pool = NULL; #if (RHINO_CONFIG_MM_BLK > 0) /* note: stats_addsize inside */ mmblk_pool = k_mm_alloc(pmmhead, RHINO_CONFIG_MM_TLF_BLK_SIZE + MM_ALIGN_UP(sizeof(mblk_pool_t))); if (mmblk_pool) { stat = krhino_mblk_pool_init(mmblk_pool, "fixed_mm_blk", (void *)((size_t)mmblk_pool + MM_ALIGN_UP(sizeof(mblk_pool_t))), RHINO_CONFIG_MM_BLK_SIZE, RHINO_CONFIG_MM_TLF_BLK_SIZE); if (stat == RHINO_SUCCESS) { pmmhead->fix_pool = mmblk_pool; #if (K_MM_STATISTIC > 0) stats_removesize(pmmhead, RHINO_CONFIG_MM_TLF_BLK_SIZE); #endif } else { /* note: stats_removesize inside */ k_mm_free(pmmhead, mmblk_pool); } #if (K_MM_STATISTIC > 0) pmmhead->maxused_size = pmmhead->used_size; #endif } #endif return RHINO_SUCCESS; }