* Replaced the sAreaHashLock with an rw_lock.

* As this was the last user of the READ_COUNT/WRITE_COUNT definitions in
  vm_priv.h, I removed those as well.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26582 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2008-07-23 16:10:52 +00:00
parent 8881176ff3
commit b4395038ee
2 changed files with 25 additions and 30 deletions
-3
View File
@@ -12,9 +12,6 @@
#include <vm_types.h>
#define WRITE_COUNT 1024
#define READ_COUNT 1
// reserved area definitions
#define RESERVED_AREA_ID -1
#define RESERVED_AVOID_BASE 0x01
+25 -27
View File
@@ -184,10 +184,10 @@ public:
};
#define REGION_HASH_TABLE_SIZE 1024
static area_id sNextAreaID;
#define AREA_HASH_TABLE_SIZE 1024
static area_id sNextAreaID = 1;
static hash_table *sAreaHash;
static sem_id sAreaHashLock;
static rw_lock sAreaHashLock = RW_LOCK_INITIALIZER("area hash");
static mutex sMappingLock = MUTEX_INITIALIZER("page mappings");
static mutex sAreaCacheLock = MUTEX_INITIALIZER("area->cache");
@@ -296,9 +296,9 @@ AddressSpaceReadLocker::SetFromArea(area_id areaID, vm_area*& area)
rw_lock_read_lock(&fSpace->lock);
acquire_sem_etc(sAreaHashLock, READ_COUNT, 0, 0);
rw_lock_read_lock(&sAreaHashLock);
area = (vm_area *)hash_lookup(sAreaHash, &areaID);
release_sem_etc(sAreaHashLock, READ_COUNT, 0);
rw_lock_read_unlock(&sAreaHashLock);
if (area == NULL || area->address_space != fSpace) {
rw_lock_read_unlock(&fSpace->lock);
@@ -379,9 +379,9 @@ AddressSpaceWriteLocker::SetFromArea(area_id areaID, vm_area*& area)
rw_lock_write_lock(&fSpace->lock);
acquire_sem_etc(sAreaHashLock, READ_COUNT, 0, 0);
rw_lock_read_lock(&sAreaHashLock);
area = (vm_area*)hash_lookup(sAreaHash, &areaID);
release_sem_etc(sAreaHashLock, READ_COUNT, 0);
rw_lock_read_unlock(&sAreaHashLock);
if (area == NULL || area->address_space != fSpace) {
rw_lock_write_unlock(&fSpace->lock);
@@ -397,7 +397,7 @@ status_t
AddressSpaceWriteLocker::SetFromArea(team_id team, area_id areaID,
bool allowKernel, vm_area*& area)
{
acquire_sem_etc(sAreaHashLock, READ_COUNT, 0, 0);
rw_lock_read_lock(&sAreaHashLock);
area = (vm_area *)hash_lookup(sAreaHash, &areaID);
if (area != NULL
@@ -407,7 +407,7 @@ AddressSpaceWriteLocker::SetFromArea(team_id team, area_id areaID,
atomic_add(&fSpace->ref_count, 1);
}
release_sem_etc(sAreaHashLock, READ_COUNT, 0);
rw_lock_read_unlock(&sAreaHashLock);
if (fSpace == NULL)
return B_BAD_VALUE;
@@ -417,9 +417,9 @@ AddressSpaceWriteLocker::SetFromArea(team_id team, area_id areaID,
rw_lock_write_lock(&fSpace->lock);
acquire_sem_etc(sAreaHashLock, READ_COUNT, 0, 0);
rw_lock_read_lock(&sAreaHashLock);
area = (vm_area *)hash_lookup(sAreaHash, &areaID);
release_sem_etc(sAreaHashLock, READ_COUNT, 0);
rw_lock_read_unlock(&sAreaHashLock);
if (area == NULL) {
rw_lock_write_unlock(&fSpace->lock);
@@ -688,9 +688,9 @@ MultiAddressSpaceLocker::AddAreaCacheAndLock(area_id areaID,
// lock the cache again and check whether anything has changed
// check whether the area is gone in the meantime
acquire_sem_etc(sAreaHashLock, READ_COUNT, 0, 0);
rw_lock_read_lock(&sAreaHashLock);
area = (vm_area *)hash_lookup(sAreaHash, &areaID);
release_sem_etc(sAreaHashLock, READ_COUNT, 0);
rw_lock_read_unlock(&sAreaHashLock);
if (area == NULL) {
Unlock();
@@ -785,7 +785,7 @@ get_address_space_by_area_id(area_id id)
{
vm_address_space* addressSpace = NULL;
acquire_sem_etc(sAreaHashLock, READ_COUNT, 0, 0);
rw_lock_read_lock(&sAreaHashLock);
vm_area *area = (vm_area *)hash_lookup(sAreaHash, &id);
if (area != NULL) {
@@ -793,7 +793,7 @@ get_address_space_by_area_id(area_id id)
atomic_add(&addressSpace->ref_count, 1);
}
release_sem_etc(sAreaHashLock, READ_COUNT, 0);
rw_lock_read_unlock(&sAreaHashLock);
return addressSpace;
}
@@ -803,13 +803,13 @@ get_address_space_by_area_id(area_id id)
static vm_area *
lookup_area(vm_address_space* addressSpace, area_id id)
{
acquire_sem_etc(sAreaHashLock, READ_COUNT, 0, 0);
rw_lock_read_lock(&sAreaHashLock);
vm_area *area = (vm_area *)hash_lookup(sAreaHash, &id);
if (area != NULL && area->address_space != addressSpace)
area = NULL;
release_sem_etc(sAreaHashLock, READ_COUNT, 0);
rw_lock_read_unlock(&sAreaHashLock);
return area;
}
@@ -1449,9 +1449,9 @@ map_backing_store(vm_address_space *addressSpace, vm_cache *cache,
cache->Unlock();
// insert the area in the global area hash table
acquire_sem_etc(sAreaHashLock, WRITE_COUNT, 0 ,0);
rw_lock_write_lock(&sAreaHashLock);
hash_insert(sAreaHash, area);
release_sem_etc(sAreaHashLock, WRITE_COUNT, 0);
rw_lock_write_unlock(&sAreaHashLock);
// grab a ref to the address space (the area holds this)
atomic_add(&addressSpace->ref_count, 1);
@@ -2238,9 +2238,9 @@ remove_area_from_address_space(vm_address_space *addressSpace, vm_area *area)
static void
delete_area(vm_address_space *addressSpace, vm_area *area)
{
acquire_sem_etc(sAreaHashLock, WRITE_COUNT, 0, 0);
rw_lock_write_lock(&sAreaHashLock);
hash_remove(sAreaHash, area);
release_sem_etc(sAreaHashLock, WRITE_COUNT, 0);
rw_lock_write_unlock(&sAreaHashLock);
// At this point the area is removed from the global hash table, but
// still exists in the area list.
@@ -3799,7 +3799,6 @@ vm_init(kernel_args *args)
// initialize some globals
sNextAreaID = 1;
sAreaHashLock = -1;
vm_page_init_num_pages(args);
sAvailableMemory = vm_page_num_pages() * B_PAGE_SIZE;
@@ -3824,7 +3823,8 @@ vm_init(kernel_args *args)
{
vm_area *area;
sAreaHash = hash_init(REGION_HASH_TABLE_SIZE, (addr_t)&area->hash_next - (addr_t)area,
sAreaHash = hash_init(AREA_HASH_TABLE_SIZE,
(addr_t)&area->hash_next - (addr_t)area,
&area_compare, &area_hash);
if (sAreaHash == NULL)
panic("vm_init: error creating aspace hash table\n");
@@ -3917,8 +3917,6 @@ vm_init_post_sem(kernel_args *args)
arch_vm_translation_map_init_post_sem(args);
vm_address_space_init_post_sem();
sAreaHashLock = create_sem(WRITE_COUNT, "area hash");
slab_init_post_sem();
return heap_init_post_sem();
}
@@ -5221,7 +5219,7 @@ area_for(void *address)
area_id
find_area(const char *name)
{
acquire_sem_etc(sAreaHashLock, READ_COUNT, 0, 0);
rw_lock_read_lock(&sAreaHashLock);
struct hash_iterator iterator;
hash_open(sAreaHash, &iterator);
@@ -5238,7 +5236,7 @@ find_area(const char *name)
}
hash_close(sAreaHash, &iterator, false);
release_sem_etc(sAreaHashLock, READ_COUNT, 0);
rw_lock_read_unlock(&sAreaHashLock);
return id;
}