和其他的内存池申请函数不一样,这里有一个wait_option选项。也就是说,如果当前没有合适的block,那么你可以选择等待处理。一旦别的线程释放内存,你就可以得到调度继续运行了。当然你也可以不等待,一旦寻找不到合适的block,立即返回为NULL。
RAW_U16 raw_block_release(MEM_POOL *pool_ptr, RAW_VOID *block_ptr) { LIST *block_list_head; RAW_U8 *work_ptr; /* Working block pointer */ RAW_U8 need_schedule = 0; RAW_SR_ALLOC(); #if (RAW_BLOCK_FUNCTION_CHECK > 0) if (block_ptr == 0) { return RAW_NULL_OBJECT; } if (pool_ptr == 0) { return RAW_NULL_OBJECT; } #endif block_list_head = &pool_ptr->common_block_obj.block_list; RAW_CRITICAL_ENTER(); work_ptr = ((RAW_U8 *) block_ptr); if (is_list_empty(block_list_head)) { /* Put the block back in the available list. */ *((RAW_U8 **) work_ptr) = pool_ptr ->raw_block_pool_available_list; /* Adjust the head pointer. */ pool_ptr ->raw_block_pool_available_list = work_ptr; /* Increment the count of available blocks. */ pool_ptr ->raw_block_pool_available++; } else { need_schedule = 1; wake_send_msg(list_entry(block_list_head->next, RAW_TASK_OBJ, task_list), block_ptr); } RAW_CRITICAL_EXIT(); if (need_schedule) { raw_sched(); } /* Return completion status. */ return RAW_SUCCESS; } |
和其他的内存free函数不一样,这里的free函数多了一个wake_send_msg的功能。这也就是说,当然如果存在阻塞等待资源的线程,那么把资源送给该线程,同时把该线程唤醒,还要把need_schedule设置为1才可以。当然如果没有等待的线程,那么直接把内存插入到链表前面中即可,就是这么简单。
相关链接: