static int adjust_calulator(LinhoneQos *qos, LinphoneQoslevel *curlevel, LinphoneQoslevel *newlevel, int isup) { if (!qos || !curlevel || !newlevel) return 1; if (0 == qos->initial_level.size) qos->initial_level.size = curlevel->size; if (isup) { return find_up_level(curlevel, newlevel, qos->initial_level.size); } else { return find_down_level(curlevel, newlevel); } return 1; }
void *k_mm_alloc(k_mm_head *mmhead, size_t size) { void *retptr; k_mm_list_t *get_b, *new_b, *next_b; int32_t level; size_t left_size; size_t req_size = size; #if (RHINO_CONFIG_MM_BLK > 0) mblk_pool_t *mm_pool; #endif (void)req_size; if (!mmhead) { return NULL; } if (size == 0) { return NULL; } MM_CRITICAL_ENTER(mmhead); #if (RHINO_CONFIG_MM_BLK > 0) /* little blk, try to get from mm_pool */ if (mmhead->fix_pool != NULL) { mm_pool = (mblk_pool_t *)mmhead->fix_pool; if (size <= RHINO_CONFIG_MM_BLK_SIZE && mm_pool->blk_avail > 0) { retptr = k_mm_smallblk_alloc(mmhead, size); if (retptr) { MM_CRITICAL_EXIT(mmhead); return retptr; } } } #endif retptr = NULL; size = MM_ALIGN_UP(size); size = size < MM_MIN_SIZE ? MM_MIN_SIZE : size; if ((level = size_to_level(size)) == -1) { goto ALLOCEXIT; } /* try to find in higher level */ get_b = find_up_level(mmhead, level); if (get_b == NULL) { /* try to find in same level */ get_b = mmhead->freelist[level]; while ( get_b != NULL ) { if ( MM_GET_BUF_SIZE(get_b) >= size ) { break; } get_b = get_b->mbinfo.free_ptr.next; } if ( get_b == NULL ) { /* do not find availalbe freeblk */ goto ALLOCEXIT; } } k_mm_freelist_delete(mmhead, get_b); next_b = MM_GET_NEXT_BLK(get_b); /* Should the block be split? */ if (MM_GET_BUF_SIZE(get_b) >= size + MMLIST_HEAD_SIZE + MM_MIN_SIZE) { left_size = MM_GET_BUF_SIZE(get_b) - size - MMLIST_HEAD_SIZE; get_b->buf_size = size | (get_b->buf_size & RHINO_MM_PRESTAT_MASK); new_b = MM_GET_NEXT_BLK(get_b); new_b->prev = get_b; new_b->buf_size = left_size | RHINO_MM_FREE | RHINO_MM_PREVALLOCED; #if (RHINO_CONFIG_MM_DEBUG > 0u) new_b->dye = RHINO_MM_FREE_DYE; new_b->owner = 0; #endif next_b->prev = new_b; k_mm_freelist_insert(mmhead, new_b); } else { next_b->buf_size &= (~RHINO_MM_PREVFREE); } get_b->buf_size &= (~RHINO_MM_FREE); /* Now it's used */ #if (RHINO_CONFIG_MM_DEBUG > 0u) get_b->dye = RHINO_MM_CORRUPT_DYE; get_b->owner = 0; #endif retptr = (void *)get_b->mbinfo.buffer; if (retptr != NULL) { stats_addsize(mmhead, MM_GET_BLK_SIZE(get_b), req_size); } ALLOCEXIT: MM_CRITICAL_EXIT(mmhead); return retptr ; }