Implemented vm_unreserve_address_range().

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7875 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2004-06-09 02:18:18 +00:00
parent e1f53d9bbe
commit 500e879b20

View File

@ -622,6 +622,57 @@ err:
}
status_t
vm_unreserve_address_range(aspace_id aid, void *address, addr_t size)
{
vm_address_space *addressSpace;
vm_region *area, *last = NULL;
status_t status = B_OK;
addressSpace = vm_get_aspace_by_id(aid);
if (addressSpace == NULL)
return ERR_VM_INVALID_ASPACE;
acquire_sem_etc(addressSpace->virtual_map.sem, WRITE_COUNT, 0, 0);
// check to see if this aspace has entered DELETE state
if (addressSpace->state == VM_ASPACE_STATE_DELETION) {
// okay, someone is trying to delete this aspace now, so we can't
// insert the region, so back out
status = ERR_VM_INVALID_ASPACE;
goto out;
}
// search region list and remove any matching reserved ranges
area = addressSpace->virtual_map.region_list;
while (area) {
// the region must be completely part of the reserved range
if (area->id == -1 && area->base >= (addr_t)address
&& area->base + area->size <= (addr_t)address + size) {
// remove reserved range
vm_region *reserved = area;
if (last)
last->aspace_next = reserved->aspace_next;
else
addressSpace->virtual_map.region_list = reserved->aspace_next;
area = reserved->aspace_next;
free(reserved);
continue;
}
last = area;
area = area->aspace_next;
}
out:
release_sem_etc(addressSpace->virtual_map.sem, WRITE_COUNT, 0);
vm_put_aspace(addressSpace);
return status;
}
status_t
vm_reserve_address_range(aspace_id aid, void **_address, uint32 addressSpec, addr_t size)
{