Rev 1587 | Rev 1702 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1587 | Rev 1594 | ||
---|---|---|---|
Line 134... | Line 134... | ||
134 | * the address space can be destroyed. |
134 | * the address space can be destroyed. |
135 | */ |
135 | */ |
136 | void as_destroy(as_t *as) |
136 | void as_destroy(as_t *as) |
137 | { |
137 | { |
138 | ipl_t ipl; |
138 | ipl_t ipl; |
139 | link_t *cur; |
139 | bool cond; |
140 | 140 | ||
141 | ASSERT(as->refcount == 0); |
141 | ASSERT(as->refcount == 0); |
142 | 142 | ||
143 | /* |
143 | /* |
144 | * Since there is no reference to this area, |
144 | * Since there is no reference to this area, |
145 | * it is safe not to lock its mutex. |
145 | * it is safe not to lock its mutex. |
146 | */ |
146 | */ |
147 | - | ||
148 | ipl = interrupts_disable(); |
147 | ipl = interrupts_disable(); |
149 | spinlock_lock(&inactive_as_with_asid_lock); |
148 | spinlock_lock(&inactive_as_with_asid_lock); |
150 | - | ||
151 | if (as->asid != ASID_INVALID && as != AS_KERNEL) { |
149 | if (as->asid != ASID_INVALID && as != AS_KERNEL) { |
152 | if (!as->cpu_refcount) |
150 | if (as != AS && as->cpu_refcount == 0) |
153 | list_remove(&as->inactive_as_with_asid_link); |
151 | list_remove(&as->inactive_as_with_asid_link); |
154 | asid_put(as->asid); |
152 | asid_put(as->asid); |
155 | } |
153 | } |
156 | spinlock_unlock(&inactive_as_with_asid_lock); |
154 | spinlock_unlock(&inactive_as_with_asid_lock); |
157 | 155 | ||
158 | /* |
156 | /* |
159 | * Destroy address space areas of the address space. |
157 | * Destroy address space areas of the address space. |
- | 158 | * The B+tee must be walked carefully because it is |
|
- | 159 | * also being destroyed. |
|
160 | */ |
160 | */ |
161 | for (cur = as->as_area_btree.leaf_head.next; cur != &as->as_area_btree.leaf_head; cur = cur->next) { |
161 | for (cond = true; cond; ) { |
162 | btree_node_t *node; |
162 | btree_node_t *node; |
163 | int i; |
- | |
164 | 163 | ||
- | 164 | ASSERT(!list_empty(&as->as_area_btree.leaf_head)); |
|
165 | node = list_get_instance(cur, btree_node_t, leaf_link); |
165 | node = list_get_instance(as->as_area_btree.leaf_head.next, btree_node_t, leaf_link); |
- | 166 | ||
166 | for (i = 0; i < node->keys; i++) |
167 | if ((cond = node->keys)) { |
167 | as_area_destroy(as, node->key[i]); |
168 | as_area_destroy(as, node->key[0]); |
- | 169 | } |
|
168 | } |
170 | } |
169 | 171 | ||
170 | btree_destroy(&as->as_area_btree); |
172 | btree_destroy(&as->as_area_btree); |
171 | page_table_destroy(as->page_table); |
173 | page_table_destroy(as->page_table); |
172 | 174 |