Changeset f8d069e8 in mainline for generic/src/mm/as.c
- Timestamp:
- 2006-06-02T00:54:56Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 01ebbdf
- Parents:
- 8da51ad
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
generic/src/mm/as.c
r8da51ad rf8d069e8 137 137 { 138 138 ipl_t ipl; 139 bool cond;139 link_t *cur; 140 140 141 141 ASSERT(as->refcount == 0); … … 157 157 * Destroy address space areas of the address space. 158 158 */ 159 for (c ond = true; cond;) {159 for (cur = as->as_area_btree.leaf_head.next; cur != &as->as_area_btree.leaf_head; cur = cur->next) { 160 160 btree_node_t *node; 161 int i; 161 162 162 ASSERT(!list_empty(&as->as_area_btree.leaf_head)); 163 node = list_get_instance(&as->as_area_btree.leaf_head.next, btree_node_t, leaf_link); 164 if ((cond = node->keys)) 165 as_area_destroy(as, node->key[0]); 166 } 167 163 node = list_get_instance(cur, btree_node_t, leaf_link); 164 for (i = 0; i < node->keys; i++) 165 as_area_destroy(as, node->key[i]); 166 } 167 168 168 btree_destroy(&as->as_area_btree); 169 169 page_table_destroy(as->page_table); … … 411 411 as_area_t *area; 412 412 __address base; 413 link_t *cur; 413 414 ipl_t ipl; 414 bool cond;415 415 416 416 ipl = interrupts_disable(); … … 433 433 /* 434 434 * Visit only the pages mapped by used_space B+tree. 435 * Note that we must be very careful when walking the tree 436 * leaf list and removing used space as the leaf list changes 437 * unpredictibly after each remove. The solution is to actually 438 * not walk the tree at all, but to remove items from the head 439 * of the leaf list until there are some keys left. 440 */ 441 for (cond = true; cond;) { 435 */ 436 for (cur = area->used_space.leaf_head.next; cur != &area->used_space.leaf_head; cur = cur->next) { 442 437 btree_node_t *node; 438 int i; 443 439 444 ASSERT(!list_empty(&area->used_space.leaf_head)); 445 node = list_get_instance(area->used_space.leaf_head.next, btree_node_t, leaf_link); 446 if ((cond = (bool) node->keys)) { 447 __address b = node->key[0]; 448 count_t i; 440 node = list_get_instance(cur, btree_node_t, leaf_link); 441 for (i = 0; i < node->keys; i++) { 442 __address b = node->key[i]; 443 count_t j; 449 444 pte_t *pte; 450 445 451 for ( i = 0; i < (count_t) node->value[0]; i++) {446 for (j = 0; j < (count_t) node->value[i]; j++) { 452 447 page_table_lock(as, false); 453 pte = page_mapping_find(as, b + i*PAGE_SIZE);448 pte = page_mapping_find(as, b + j*PAGE_SIZE); 454 449 ASSERT(pte && PTE_VALID(pte) && PTE_PRESENT(pte)); 455 450 if (area->backend && area->backend->frame_free) { 456 451 area->backend->frame_free(area, 457 b + i*PAGE_SIZE, PTE_GET_FRAME(pte));452 b + j*PAGE_SIZE, PTE_GET_FRAME(pte)); 458 453 } 459 page_mapping_remove(as, b + i*PAGE_SIZE);454 page_mapping_remove(as, b + j*PAGE_SIZE); 460 455 page_table_unlock(as, false); 461 456 } … … 1474 1469 if (--sh_info->refcount == 0) { 1475 1470 dealloc = true; 1476 bool cond;1471 link_t *cur; 1477 1472 1478 1473 /* … … 1480 1475 * reference from all frames found there. 1481 1476 */ 1482 for (c ond = true; cond;) {1477 for (cur = sh_info->pagemap.leaf_head.next; cur != &sh_info->pagemap.leaf_head; cur = cur->next) { 1483 1478 btree_node_t *node; 1479 int i; 1484 1480 1485 ASSERT(!list_empty(&sh_info->pagemap.leaf_head)); 1486 node = list_get_instance(sh_info->pagemap.leaf_head.next, btree_node_t, leaf_link); 1487 if ((cond = node->keys)) { 1488 frame_free(ADDR2PFN((__address) node->value[0])); 1489 } 1481 node = list_get_instance(cur, btree_node_t, leaf_link); 1482 for (i = 0; i < node->keys; i++) 1483 frame_free(ADDR2PFN((__address) node->value[i])); 1490 1484 } 1491 1485
Note:
See TracChangeset
for help on using the changeset viewer.