/** * Finds the first node in an avl-tree with a key greater or equal * than the specified key * @param tree pointer to avl-tree * @param key pointer to specified key * @return pointer to avl-node, NULL if no node with * key greater or equal specified key exists. */ struct avl_node * avl_find_greaterequal(const struct avl_tree *tree, const void *key) { struct avl_node *node, *next; int diff; if (tree->root == NULL) return NULL; node = _avl_find_rec(tree->root, key, tree->comp, &diff); /* go right as long as key>node.key */ while (diff > 0) { if (list_is_last(&tree->list_head, &node->list)) { return NULL; } node = (struct avl_node *)node->list.next; diff = (*tree->comp) (key, node->key); } /* go left as long as key<=next_node.key */ next = node; while (diff <= 0) { node = next; if (list_is_first(&tree->list_head, &node->list)) { break; } next = (struct avl_node *)node->list.prev; diff = (*tree->comp) (key, next->key); } return node; }
//ÊͷŵÄʱºòºÏ²¢,Ïà¶ÔÓÚbinder¶øÑÔ£¬ÕâÀïµÄ»º³åÇø»áÀ©Õ¹£¬ËùÒÔÄÚ´æ²»ÊÇÈ«²¿Á¬Ðø£¬¶øÊÇÒ»¶Î¶ÎÁ¬Ðø void fms_mem_free(fms_mem_pool *mem_pool, void *data) { fms_mem_block *block = (fms_mem_block *)((fms_u8 *)data - sizeof(fms_mem_block));//×îºÃÓúêÀ´ÊµÏÖ rb_erase(&block->rb_node, &mem_pool->allocated_blocks); if (!list_is_last(&block->entry, &mem_pool->blocks)) {//Èç¹û²»ÊÇ×îºóÒ»¸ö£¬ÏòºóºÏ²¢ fms_mem_block *next = list_entry(&block->entry.next, fms_mem_block, entry); if (next->free && next->id == block->id) { //IDÏàͬ²ÅÊÇͬһ¶ÎÁ¬ÐøÄڴ棬²Å¿ÉÄܺϲ¢ rb_erase(&next->rb_node, &mem_pool->free_blocks); list_del(&next->entry); block->data_size += sizeof(fms_mem_block) + next->data_size;//Êý¾ÝÇøÀ©Õ¹£¬ºÏ²¢ } } if (!list_is_first(&block->entry, &mem_pool->blocks)) {//Èç¹û²»ÊÇ×îÇ°ÃæµÄÒ»¸ö£¬ÏòÇ°ºÏ²¢ fms_mem_block *prev = list_entry(&block->entry.prev, fms_mem_block, entry); if (prev->free && prev->id == block->id) { rb_erase(&prev->rb_node, &mem_pool->free_blocks); prev->data_size += sizeof(fms_mem_block) + block->data_size; list_del(&block->entry); block = prev; } } block->free = FMS_TRUE; mem_block_insert_free(mem_pool, block); }