[haiku-commits] r34493 - in haiku/trunk: headers/private/kernel/vm src/system/kernel/vm

Author: bonefish
Date: 2009-12-04 18:07:16 +0100 (Fri, 04 Dec 2009)
New Revision: 34493
Changeset: http://dev.haiku-os.org/changeset/34493/haiku

Added:
   haiku/trunk/src/system/kernel/vm/VMKernelArea.cpp
   haiku/trunk/src/system/kernel/vm/VMKernelArea.h
   haiku/trunk/src/system/kernel/vm/VMUserArea.cpp
   haiku/trunk/src/system/kernel/vm/VMUserArea.h
Modified:
   haiku/trunk/headers/private/kernel/vm/VMAddressSpace.h
   haiku/trunk/headers/private/kernel/vm/VMArea.h
   haiku/trunk/src/system/kernel/vm/Jamfile
   haiku/trunk/src/system/kernel/vm/VMArea.cpp
   haiku/trunk/src/system/kernel/vm/VMKernelAddressSpace.cpp
   haiku/trunk/src/system/kernel/vm/VMKernelAddressSpace.h
   haiku/trunk/src/system/kernel/vm/VMUserAddressSpace.cpp
   haiku/trunk/src/system/kernel/vm/VMUserAddressSpace.h
   haiku/trunk/src/system/kernel/vm/vm.cpp
Log:
* Added VMArea subclasses VM{Kernel,User}Area and moved the address space list
  link to them.
* VM{Kernel,User}AddressSpace manage the respective VMArea subclass now, and
  VMAddressSpace has grown factory methods {Create,Delete}Area.


Modified: haiku/trunk/headers/private/kernel/vm/VMAddressSpace.h
===================================================================
--- haiku/trunk/headers/private/kernel/vm/VMAddressSpace.h      2009-12-04 
14:45:08 UTC (rev 34492)
+++ haiku/trunk/headers/private/kernel/vm/VMAddressSpace.h      2009-12-04 
17:07:16 UTC (rev 34493)
@@ -66,6 +66,9 @@
        virtual VMArea*                         NextArea(VMArea* area) const = 
0;
 
        virtual VMArea*                         LookupArea(addr_t address) 
const = 0;
+       virtual VMArea*                         CreateArea(const char* name, 
uint32 wiring,
+                                                                       uint32 
protection) = 0;
+       virtual void                            DeleteArea(VMArea* area) = 0;
        virtual status_t                        InsertArea(void** _address, 
uint32 addressSpec,
                                                                        addr_t 
size, VMArea* area) = 0;
        virtual void                            RemoveArea(VMArea* area) = 0;

Modified: haiku/trunk/headers/private/kernel/vm/VMArea.h
===================================================================
--- haiku/trunk/headers/private/kernel/vm/VMArea.h      2009-12-04 14:45:08 UTC 
(rev 34492)
+++ haiku/trunk/headers/private/kernel/vm/VMArea.h      2009-12-04 17:07:16 UTC 
(rev 34493)
@@ -48,50 +48,28 @@
                                                                        { 
return address >= fBase
                                                                                
&& address <= fBase + (fSize - 1); }
 
-       static  VMArea*                         Create(VMAddressSpace* 
addressSpace,
-                                                                       const 
char* name, uint32 wiring,
-                                                                       uint32 
protection);
-       static  VMArea*                         CreateReserved(VMAddressSpace* 
addressSpace,
-                                                                       uint32 
flags);
+protected:
+                                                               
VMArea(VMAddressSpace* addressSpace,
+                                                                       uint32 
wiring, uint32 protection);
+                                                               ~VMArea();
 
-                       DoublyLinkedListLink<VMArea>& AddressSpaceLink()
-                                                                       { 
return fAddressSpaceLink; }
-                       const DoublyLinkedListLink<VMArea>& AddressSpaceLink() 
const
-                                                                       { 
return fAddressSpaceLink; }
+                       status_t                        Init(const char* name);
 
-private:
+protected:
                        friend class VMAddressSpace;
                        friend class VMKernelAddressSpace;
                        friend class VMUserAddressSpace;
 
-private:
+protected:
                        void                            SetBase(addr_t base)    
{ fBase = base; }
                        void                            SetSize(size_t size)    
{ fSize = size; }
 
-private:
-                       DoublyLinkedListLink<VMArea> fAddressSpaceLink;
+protected:
                        addr_t                          fBase;
                        size_t                          fSize;
 };
 
 
-struct VMAddressSpaceAreaGetLink {
-    inline DoublyLinkedListLink<VMArea>* operator()(VMArea* area) const
-    {
-        return &area->AddressSpaceLink();
-    }
-
-    inline const DoublyLinkedListLink<VMArea>* operator()(
-               const VMArea* area) const
-    {
-        return &area->AddressSpaceLink();
-    }
-};
-
-typedef DoublyLinkedList<VMArea, VMAddressSpaceAreaGetLink>
-       VMAddressSpaceAreaList;
-
-
 struct VMAreaHashDefinition {
        typedef area_id         KeyType;
        typedef VMArea          ValueType;

Modified: haiku/trunk/src/system/kernel/vm/Jamfile
===================================================================
--- haiku/trunk/src/system/kernel/vm/Jamfile    2009-12-04 14:45:08 UTC (rev 
34492)
+++ haiku/trunk/src/system/kernel/vm/Jamfile    2009-12-04 17:07:16 UTC (rev 
34493)
@@ -16,8 +16,10 @@
        VMCache.cpp
        VMDeviceCache.cpp
        VMKernelAddressSpace.cpp
+       VMKernelArea.cpp
        VMNullCache.cpp
        VMUserAddressSpace.cpp
+       VMUserArea.cpp
 
        : $(TARGET_KERNEL_PIC_CCFLAGS)
 ;

Modified: haiku/trunk/src/system/kernel/vm/VMArea.cpp
===================================================================
--- haiku/trunk/src/system/kernel/vm/VMArea.cpp 2009-12-04 14:45:08 UTC (rev 
34492)
+++ haiku/trunk/src/system/kernel/vm/VMArea.cpp 2009-12-04 17:07:16 UTC (rev 
34493)
@@ -11,7 +11,6 @@
 #include <vm/VMArea.h>
 
 #include <heap.h>
-#include <vm/vm_priv.h>
 
 
 #define AREA_HASH_TABLE_SIZE 1024
@@ -24,61 +23,49 @@
 
 // #pragma mark - VMArea
 
-
-/*static*/ VMArea*
-VMArea::Create(VMAddressSpace* addressSpace, const char* name,
-       uint32 wiring, uint32 protection)
+VMArea::VMArea(VMAddressSpace* addressSpace, uint32 wiring, uint32 protection)
+       :
+       name(NULL),
+       protection(protection),
+       wiring(wiring),
+       memory_type(0),
+       cache(NULL),
+       no_cache_change(0),
+       cache_offset(0),
+       cache_type(0),
+       page_protections(NULL),
+       address_space(addressSpace),
+       cache_next(NULL),
+       cache_prev(NULL),
+       hash_next(NULL)
 {
-       // restrict the area name to B_OS_NAME_LENGTH
-       size_t length = strlen(name) + 1;
-       if (length > B_OS_NAME_LENGTH)
-               length = B_OS_NAME_LENGTH;
+       new (&mappings) VMAreaMappings;
+}
 
-       VMArea* area = (VMArea*)malloc_nogrow(sizeof(VMArea));
-       if (area == NULL)
-               return NULL;
 
-       area->name = (char*)malloc_nogrow(length);
-       if (area->name == NULL) {
-               free(area);
-               return NULL;
-       }
-       strlcpy(area->name, name, length);
-
-       area->id = atomic_add(&sNextAreaID, 1);
-       area->fBase = 0;
-       area->fSize = 0;
-       area->protection = protection;
-       area->wiring = wiring;
-       area->memory_type = 0;
-
-       area->cache = NULL;
-       area->cache_offset = 0;
-
-       area->address_space = addressSpace;
-       area->cache_next = area->cache_prev = NULL;
-       area->hash_next = NULL;
-       new (&area->mappings) VMAreaMappings;
-       area->page_protections = NULL;
-
-       return area;
+VMArea::~VMArea()
+{
+       free(page_protections);
+       free(name);
 }
 
 
-/*static*/ VMArea*
-VMArea::CreateReserved(VMAddressSpace* addressSpace, uint32 flags)
+status_t
+VMArea::Init(const char* name)
 {
-       VMArea* reserved = (VMArea*)malloc_nogrow(sizeof(VMArea));
-       if (reserved == NULL)
-               return NULL;
+       // restrict the area name to B_OS_NAME_LENGTH
+       size_t length = strlen(name) + 1;
+       if (length > B_OS_NAME_LENGTH)
+               length = B_OS_NAME_LENGTH;
 
-       memset(reserved, 0, sizeof(VMArea));
-       reserved->id = RESERVED_AREA_ID;
-               // this marks it as reserved space
-       reserved->protection = flags;
-       reserved->address_space = addressSpace;
+       // clone the name
+       this->name = (char*)malloc_nogrow(length);
+       if (this->name == NULL)
+               return B_NO_MEMORY;
+       strlcpy(this->name, name, length);
 
-       return reserved;
+       id = atomic_add(&sNextAreaID, 1);
+       return B_OK;
 }
 
 
@@ -114,9 +101,6 @@
 
        for (VMAreaHashTable::Iterator it = sTable.GetIterator();
                        VMArea* area = it.Next();) {
-               if (area->id == RESERVED_AREA_ID)
-                       continue;
-
                if (strcmp(area->name, name) == 0) {
                        id = area->id;
                        break;

Modified: haiku/trunk/src/system/kernel/vm/VMKernelAddressSpace.cpp
===================================================================
--- haiku/trunk/src/system/kernel/vm/VMKernelAddressSpace.cpp   2009-12-04 
14:45:08 UTC (rev 34492)
+++ haiku/trunk/src/system/kernel/vm/VMKernelAddressSpace.cpp   2009-12-04 
17:07:16 UTC (rev 34493)
@@ -56,7 +56,7 @@
 inline VMArea*
 VMKernelAddressSpace::FirstArea() const
 {
-       VMArea* area = fAreas.Head();
+       VMKernelArea* area = fAreas.Head();
        while (area != NULL && area->id == RESERVED_AREA_ID)
                area = fAreas.GetNext(area);
        return area;
@@ -64,8 +64,9 @@
 
 
 inline VMArea*
-VMKernelAddressSpace::NextArea(VMArea* area) const
+VMKernelAddressSpace::NextArea(VMArea* _area) const
 {
+       VMKernelArea* area = static_cast<VMKernelArea*>(_area);
        area = fAreas.GetNext(area);
        while (area != NULL && area->id == RESERVED_AREA_ID)
                area = fAreas.GetNext(area);
@@ -73,6 +74,21 @@
 }
 
 
+VMArea*
+VMKernelAddressSpace::CreateArea(const char* name, uint32 wiring,
+       uint32 protection)
+{
+       return VMKernelArea::Create(this, name, wiring, protection);
+}
+
+
+void
+VMKernelAddressSpace::DeleteArea(VMArea* area)
+{
+       delete static_cast<VMKernelArea*>(area);
+}
+
+
 //! You must hold the address space's read lock.
 VMArea*
 VMKernelAddressSpace::LookupArea(addr_t address) const
@@ -81,8 +97,8 @@
        if (fAreaHint != NULL && fAreaHint->ContainsAddress(address))
                return fAreaHint;
 
-       for (VMAddressSpaceAreaList::ConstIterator it = fAreas.GetIterator();
-                       VMArea* area = it.Next();) {
+       for (VMKernelAreaList::ConstIterator it = fAreas.GetIterator();
+                       VMKernelArea* area = it.Next();) {
                if (area->id == RESERVED_AREA_ID)
                        continue;
 
@@ -103,8 +119,10 @@
 */
 status_t
 VMKernelAddressSpace::InsertArea(void** _address, uint32 addressSpec,
-       addr_t size, VMArea* area)
+       addr_t size, VMArea* _area)
 {
+       VMKernelArea* area = static_cast<VMKernelArea*>(_area);
+
        addr_t searchBase, searchEnd;
        status_t status;
 
@@ -146,8 +164,10 @@
 
 //! You must hold the address space's write lock.
 void
-VMKernelAddressSpace::RemoveArea(VMArea* area)
+VMKernelAddressSpace::RemoveArea(VMArea* _area)
 {
+       VMKernelArea* area = static_cast<VMKernelArea*>(_area);
+
        fAreas.Remove(area);
 
        if (area->id != RESERVED_AREA_ID) {
@@ -163,7 +183,7 @@
 bool
 VMKernelAddressSpace::CanResizeArea(VMArea* area, size_t newSize)
 {
-       VMArea* next = fAreas.GetNext(area);
+       VMKernelArea* next = fAreas.GetNext(static_cast<VMKernelArea*>(area));
        addr_t newEnd = area->Base() + (newSize - 1);
        if (next == NULL) {
                if (fEndAddress >= newEnd)
@@ -187,10 +207,12 @@
 
 
 status_t
-VMKernelAddressSpace::ResizeArea(VMArea* area, size_t newSize)
+VMKernelAddressSpace::ResizeArea(VMArea* _area, size_t newSize)
 {
+       VMKernelArea* area = static_cast<VMKernelArea*>(_area);
+
        addr_t newEnd = area->Base() + (newSize - 1);
-       VMArea* next = fAreas.GetNext(area);
+       VMKernelArea* next = fAreas.GetNext(area);
        if (next != NULL && next->Base() <= newEnd) {
                if (next->id != RESERVED_AREA_ID
                        || next->cache_offset > area->Base()
@@ -256,7 +278,7 @@
                return B_BAD_TEAM_ID;
        }
 
-       VMArea* area = VMArea::CreateReserved(this, flags);
+       VMKernelArea* area = VMKernelArea::CreateReserved(this, flags);
        if (area == NULL)
                return B_NO_MEMORY;
 
@@ -286,8 +308,8 @@
 
        // search area list and remove any matching reserved ranges
        addr_t endAddress = address + (size - 1);
-       for (VMAddressSpaceAreaList::Iterator it = fAreas.GetIterator();
-                       VMArea* area = it.Next();) {
+       for (VMKernelAreaList::Iterator it = fAreas.GetIterator();
+                       VMKernelArea* area = it.Next();) {
                // the area must be completely part of the reserved range
                if (area->Base() + (area->Size() - 1) > endAddress)
                        break;
@@ -306,8 +328,8 @@
 void
 VMKernelAddressSpace::UnreserveAllAddressRanges()
 {
-       for (VMAddressSpaceAreaList::Iterator it = fAreas.GetIterator();
-                       VMArea* area = it.Next();) {
+       for (VMKernelAreaList::Iterator it = fAreas.GetIterator();
+                       VMKernelArea* area = it.Next();) {
                if (area->id == RESERVED_AREA_ID) {
                        RemoveArea(area);
                        Put();
@@ -325,8 +347,8 @@
 
        kprintf("area_list:\n");
 
-       for (VMAddressSpaceAreaList::ConstIterator it = fAreas.GetIterator();
-                       VMArea* area = it.Next();) {
+       for (VMKernelAreaList::ConstIterator it = fAreas.GetIterator();
+                       VMKernelArea* area = it.Next();) {
                kprintf(" area 0x%lx: ", area->id);
                kprintf("base_addr = 0x%lx ", area->Base());
                kprintf("size = 0x%lx ", area->Size());
@@ -342,11 +364,11 @@
 */
 status_t
 VMKernelAddressSpace::_InsertAreaIntoReservedRegion(addr_t start, size_t size,
-       VMArea* area)
+       VMKernelArea* area)
 {
-       VMArea* next;
+       VMKernelArea* next;
 
-       for (VMAddressSpaceAreaList::Iterator it = fAreas.GetIterator();
+       for (VMKernelAreaList::Iterator it = fAreas.GetIterator();
                        (next = it.Next()) != NULL;) {
                if (next->Base() <= start
                        && next->Base() + (next->Size() - 1) >= start + (size - 
1)) {
@@ -390,7 +412,8 @@
        } else {
                // the area splits the reserved range into two separate ones
                // we need a new reserved area to cover this space
-               VMArea* reserved = VMArea::CreateReserved(this, 
next->protection);
+               VMKernelArea* reserved = VMKernelArea::CreateReserved(this,
+                       next->protection);
                if (reserved == NULL)
                        return B_NO_MEMORY;
 
@@ -416,10 +439,10 @@
 /*!    Must be called with this address space's write lock held */
 status_t
 VMKernelAddressSpace::_InsertAreaSlot(addr_t start, addr_t size, addr_t end,
-       uint32 addressSpec, VMArea* area)
+       uint32 addressSpec, VMKernelArea* area)
 {
-       VMArea* last = NULL;
-       VMArea* next;
+       VMKernelArea* last = NULL;
+       VMKernelArea* next;
        bool foundSpot = false;
 
        TRACE(("VMKernelAddressSpace::_InsertAreaSlot: address space %p, start "
@@ -453,7 +476,7 @@
 
        // walk up to the spot where we should start searching
 second_chance:
-       VMAddressSpaceAreaList::Iterator it = fAreas.GetIterator();
+       VMKernelAreaList::Iterator it = fAreas.GetIterator();
        while ((next = it.Next()) != NULL) {
                if (next->Base() > start + (size - 1)) {
                        // we have a winner

Modified: haiku/trunk/src/system/kernel/vm/VMKernelAddressSpace.h
===================================================================
--- haiku/trunk/src/system/kernel/vm/VMKernelAddressSpace.h     2009-12-04 
14:45:08 UTC (rev 34492)
+++ haiku/trunk/src/system/kernel/vm/VMKernelAddressSpace.h     2009-12-04 
17:07:16 UTC (rev 34493)
@@ -12,7 +12,9 @@
 
 #include <vm/VMAddressSpace.h>
 
+#include "VMKernelArea.h"
 
+
 struct VMKernelAddressSpace : VMAddressSpace {
 public:
                                                                
VMKernelAddressSpace(team_id id, addr_t base,
@@ -23,6 +25,9 @@
        virtual VMArea*                         NextArea(VMArea* area) const;
 
        virtual VMArea*                         LookupArea(addr_t address) 
const;
+       virtual VMArea*                         CreateArea(const char* name, 
uint32 wiring,
+                                                                       uint32 
protection);
+       virtual void                            DeleteArea(VMArea* area);
        virtual status_t                        InsertArea(void** _address, 
uint32 addressSpec,
                                                                        addr_t 
size, VMArea* area);
        virtual void                            RemoveArea(VMArea* area);
@@ -43,13 +48,13 @@
 
 private:
                        status_t                        
_InsertAreaIntoReservedRegion(addr_t start,
-                                                                       size_t 
size, VMArea* area);
+                                                                       size_t 
size, VMKernelArea* area);
                        status_t                        _InsertAreaSlot(addr_t 
start, addr_t size,
                                                                        addr_t 
end, uint32 addressSpec,
-                                                                       VMArea* 
area);
+                                                                       
VMKernelArea* area);
 
 private:
-                       VMAddressSpaceAreaList fAreas;
+                       VMKernelAreaList        fAreas;
        mutable VMArea*                         fAreaHint;
 };
 

Added: haiku/trunk/src/system/kernel/vm/VMKernelArea.cpp
===================================================================
--- haiku/trunk/src/system/kernel/vm/VMKernelArea.cpp                           
(rev 0)
+++ haiku/trunk/src/system/kernel/vm/VMKernelArea.cpp   2009-12-04 17:07:16 UTC 
(rev 34493)
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the NewOS License.
+ */
+
+
+#include "VMKernelArea.h"
+
+#include <heap.h>
+#include <vm/vm_priv.h>
+
+
+VMKernelArea::VMKernelArea(VMAddressSpace* addressSpace, uint32 wiring,
+       uint32 protection)
+       :
+       VMArea(addressSpace, wiring, protection)
+{
+}
+
+
+VMKernelArea::~VMKernelArea()
+{
+}
+
+
+/*static*/ VMKernelArea*
+VMKernelArea::Create(VMAddressSpace* addressSpace, const char* name,
+       uint32 wiring, uint32 protection)
+{
+       VMKernelArea* area = new(nogrow) VMKernelArea(addressSpace, wiring,
+               protection);
+       if (area == NULL)
+               return NULL;
+
+       if (area->Init(name) != B_OK) {
+               delete area;
+               return NULL;
+       }
+
+       return area;
+}
+
+
+/*static*/ VMKernelArea*
+VMKernelArea::CreateReserved(VMAddressSpace* addressSpace, uint32 flags)
+{
+       VMKernelArea* area = new(nogrow) VMKernelArea(addressSpace, 0, 0);
+       if (area != NULL)
+               area->id = RESERVED_AREA_ID;
+       return area;
+}

Added: haiku/trunk/src/system/kernel/vm/VMKernelArea.h
===================================================================
--- haiku/trunk/src/system/kernel/vm/VMKernelArea.h                             
(rev 0)
+++ haiku/trunk/src/system/kernel/vm/VMKernelArea.h     2009-12-04 17:07:16 UTC 
(rev 34493)
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the NewOS License.
+ */
+#ifndef VM_KERNEL_AREA_H
+#define VM_KERNEL_AREA_H
+
+
+#include <vm/VMArea.h>
+
+
+struct VMKernelAddressSpace;
+
+
+struct VMKernelArea : VMArea {
+                                                               
VMKernelArea(VMAddressSpace* addressSpace,
+                                                                       uint32 
wiring, uint32 protection);
+                                                               ~VMKernelArea();
+
+       static  VMKernelArea*           Create(VMAddressSpace* addressSpace,
+                                                                       const 
char* name, uint32 wiring,
+                                                                       uint32 
protection);
+       static  VMKernelArea*           CreateReserved(VMAddressSpace* 
addressSpace,
+                                                                       uint32 
flags);
+
+                       DoublyLinkedListLink<VMKernelArea>& AddressSpaceLink()
+                                                                       { 
return fAddressSpaceLink; }
+                       const DoublyLinkedListLink<VMKernelArea>& 
AddressSpaceLink() const
+                                                                       { 
return fAddressSpaceLink; }
+
+private:
+                       DoublyLinkedListLink<VMKernelArea> fAddressSpaceLink;
+};
+
+
+struct VMKernelAreaGetLink {
+    inline DoublyLinkedListLink<VMKernelArea>* operator()(
+               VMKernelArea* area) const
+    {
+        return &area->AddressSpaceLink();
+    }
+
+    inline const DoublyLinkedListLink<VMKernelArea>* operator()(
+               const VMKernelArea* area) const
+    {
+        return &area->AddressSpaceLink();
+    }
+};
+
+typedef DoublyLinkedList<VMKernelArea, VMKernelAreaGetLink> VMKernelAreaList;
+
+
+#endif // VM_KERNEL_AREA_H

Modified: haiku/trunk/src/system/kernel/vm/VMUserAddressSpace.cpp
===================================================================
--- haiku/trunk/src/system/kernel/vm/VMUserAddressSpace.cpp     2009-12-04 
14:45:08 UTC (rev 34492)
+++ haiku/trunk/src/system/kernel/vm/VMUserAddressSpace.cpp     2009-12-04 
17:07:16 UTC (rev 34493)
@@ -56,7 +56,7 @@
 inline VMArea*
 VMUserAddressSpace::FirstArea() const
 {
-       VMArea* area = fAreas.Head();
+       VMUserArea* area = fAreas.Head();
        while (area != NULL && area->id == RESERVED_AREA_ID)
                area = fAreas.GetNext(area);
        return area;
@@ -64,8 +64,9 @@
 
 
 inline VMArea*
-VMUserAddressSpace::NextArea(VMArea* area) const
+VMUserAddressSpace::NextArea(VMArea* _area) const
 {
+       VMUserArea* area = static_cast<VMUserArea*>(_area);
        area = fAreas.GetNext(area);
        while (area != NULL && area->id == RESERVED_AREA_ID)
                area = fAreas.GetNext(area);
@@ -73,6 +74,21 @@
 }
 
 
+VMArea*
+VMUserAddressSpace::CreateArea(const char* name, uint32 wiring,
+       uint32 protection)
+{
+       return VMUserArea::Create(this, name, wiring, protection);
+}
+
+
+void
+VMUserAddressSpace::DeleteArea(VMArea* area)
+{
+       delete static_cast<VMUserArea*>(area);
+}
+
+
 //! You must hold the address space's read lock.
 VMArea*
 VMUserAddressSpace::LookupArea(addr_t address) const
@@ -81,8 +97,8 @@
        if (fAreaHint != NULL && fAreaHint->ContainsAddress(address))
                return fAreaHint;
 
-       for (VMAddressSpaceAreaList::ConstIterator it = fAreas.GetIterator();
-                       VMArea* area = it.Next();) {
+       for (VMUserAreaList::ConstIterator it = fAreas.GetIterator();
+                       VMUserArea* area = it.Next();) {
                if (area->id == RESERVED_AREA_ID)
                        continue;
 
@@ -103,8 +119,10 @@
 */
 status_t
 VMUserAddressSpace::InsertArea(void** _address, uint32 addressSpec,
-       addr_t size, VMArea* area)
+       addr_t size, VMArea* _area)
 {
+       VMUserArea* area = static_cast<VMUserArea*>(_area);
+
        addr_t searchBase, searchEnd;
        status_t status;
 
@@ -146,8 +164,10 @@
 
 //! You must hold the address space's write lock.
 void
-VMUserAddressSpace::RemoveArea(VMArea* area)
+VMUserAddressSpace::RemoveArea(VMArea* _area)
 {
+       VMUserArea* area = static_cast<VMUserArea*>(_area);
+
        fAreas.Remove(area);
 
        if (area->id != RESERVED_AREA_ID) {
@@ -163,7 +183,7 @@
 bool
 VMUserAddressSpace::CanResizeArea(VMArea* area, size_t newSize)
 {
-       VMArea* next = fAreas.GetNext(area);
+       VMUserArea* next = fAreas.GetNext(static_cast<VMUserArea*>(area));
        addr_t newEnd = area->Base() + (newSize - 1);
        if (next == NULL) {
                if (fEndAddress >= newEnd)
@@ -187,10 +207,12 @@
 
 
 status_t
-VMUserAddressSpace::ResizeArea(VMArea* area, size_t newSize)
+VMUserAddressSpace::ResizeArea(VMArea* _area, size_t newSize)
 {
+       VMUserArea* area = static_cast<VMUserArea*>(_area);
+
        addr_t newEnd = area->Base() + (newSize - 1);
-       VMArea* next = fAreas.GetNext(area);
+       VMUserArea* next = fAreas.GetNext(area);
        if (next != NULL && next->Base() <= newEnd) {
                if (next->id != RESERVED_AREA_ID
                        || next->cache_offset > area->Base()
@@ -256,7 +278,7 @@
                return B_BAD_TEAM_ID;
        }
 
-       VMArea* area = VMArea::CreateReserved(this, flags);
+       VMUserArea* area = VMUserArea::CreateReserved(this, flags);
        if (area == NULL)
                return B_NO_MEMORY;
 
@@ -286,8 +308,8 @@
 
        // search area list and remove any matching reserved ranges
        addr_t endAddress = address + (size - 1);
-       for (VMAddressSpaceAreaList::Iterator it = fAreas.GetIterator();
-                       VMArea* area = it.Next();) {
+       for (VMUserAreaList::Iterator it = fAreas.GetIterator();
+                       VMUserArea* area = it.Next();) {
                // the area must be completely part of the reserved range
                if (area->Base() + (area->Size() - 1) > endAddress)
                        break;
@@ -306,8 +328,8 @@
 void
 VMUserAddressSpace::UnreserveAllAddressRanges()
 {
-       for (VMAddressSpaceAreaList::Iterator it = fAreas.GetIterator();
-                       VMArea* area = it.Next();) {
+       for (VMUserAreaList::Iterator it = fAreas.GetIterator();
+                       VMUserArea* area = it.Next();) {
                if (area->id == RESERVED_AREA_ID) {
                        RemoveArea(area);
                        Put();
@@ -325,8 +347,8 @@
 
        kprintf("area_list:\n");
 
-       for (VMAddressSpaceAreaList::ConstIterator it = fAreas.GetIterator();
-                       VMArea* area = it.Next();) {
+       for (VMUserAreaList::ConstIterator it = fAreas.GetIterator();
+                       VMUserArea* area = it.Next();) {
                kprintf(" area 0x%lx: ", area->id);
                kprintf("base_addr = 0x%lx ", area->Base());
                kprintf("size = 0x%lx ", area->Size());
@@ -342,11 +364,11 @@
 */
 status_t
 VMUserAddressSpace::_InsertAreaIntoReservedRegion(addr_t start, size_t size,
-       VMArea* area)
+       VMUserArea* area)
 {
-       VMArea* next;
+       VMUserArea* next;
 
-       for (VMAddressSpaceAreaList::Iterator it = fAreas.GetIterator();
+       for (VMUserAreaList::Iterator it = fAreas.GetIterator();
                        (next = it.Next()) != NULL;) {
                if (next->Base() <= start
                        && next->Base() + (next->Size() - 1) >= start + (size - 
1)) {
@@ -390,7 +412,8 @@
        } else {
                // the area splits the reserved range into two separate ones
                // we need a new reserved area to cover this space
-               VMArea* reserved = VMArea::CreateReserved(this, 
next->protection);
+               VMUserArea* reserved = VMUserArea::CreateReserved(this,
+                       next->protection);
                if (reserved == NULL)
                        return B_NO_MEMORY;
 
@@ -416,10 +439,10 @@
 /*!    Must be called with this address space's write lock held */
 status_t
 VMUserAddressSpace::_InsertAreaSlot(addr_t start, addr_t size, addr_t end,
-       uint32 addressSpec, VMArea* area)
+       uint32 addressSpec, VMUserArea* area)
 {
-       VMArea* last = NULL;
-       VMArea* next;
+       VMUserArea* last = NULL;
+       VMUserArea* next;
        bool foundSpot = false;
 
        TRACE(("VMUserAddressSpace::_InsertAreaSlot: address space %p, start "
@@ -453,7 +476,7 @@
 
        // walk up to the spot where we should start searching
 second_chance:
-       VMAddressSpaceAreaList::Iterator it = fAreas.GetIterator();
+       VMUserAreaList::Iterator it = fAreas.GetIterator();
        while ((next = it.Next()) != NULL) {
                if (next->Base() > start + (size - 1)) {
                        // we have a winner

Modified: haiku/trunk/src/system/kernel/vm/VMUserAddressSpace.h
===================================================================
--- haiku/trunk/src/system/kernel/vm/VMUserAddressSpace.h       2009-12-04 
14:45:08 UTC (rev 34492)
+++ haiku/trunk/src/system/kernel/vm/VMUserAddressSpace.h       2009-12-04 
17:07:16 UTC (rev 34493)
@@ -12,7 +12,9 @@
 
 #include <vm/VMAddressSpace.h>
 
+#include "VMUserArea.h"
 
+
 struct VMUserAddressSpace : VMAddressSpace {
 public:
                                                                
VMUserAddressSpace(team_id id, addr_t base,
@@ -23,6 +25,9 @@
        virtual VMArea*                         NextArea(VMArea* area) const;
 
        virtual VMArea*                         LookupArea(addr_t address) 
const;
+       virtual VMArea*                         CreateArea(const char* name, 
uint32 wiring,
+                                                                       uint32 
protection);
+       virtual void                            DeleteArea(VMArea* area);
        virtual status_t                        InsertArea(void** _address, 
uint32 addressSpec,
                                                                        addr_t 
size, VMArea* area);
        virtual void                            RemoveArea(VMArea* area);
@@ -43,13 +48,13 @@
 
 private:
                        status_t                        
_InsertAreaIntoReservedRegion(addr_t start,
-                                                                       size_t 
size, VMArea* area);
+                                                                       size_t 
size, VMUserArea* area);
                        status_t                        _InsertAreaSlot(addr_t 
start, addr_t size,
                                                                        addr_t 
end, uint32 addressSpec,
-                                                                       VMArea* 
area);
+                                                                       
VMUserArea* area);
 
 private:
-                       VMAddressSpaceAreaList fAreas;
+                       VMUserAreaList  fAreas;
        mutable VMArea*                         fAreaHint;
 };
 

Added: haiku/trunk/src/system/kernel/vm/VMUserArea.cpp
===================================================================
--- haiku/trunk/src/system/kernel/vm/VMUserArea.cpp                             
(rev 0)
+++ haiku/trunk/src/system/kernel/vm/VMUserArea.cpp     2009-12-04 17:07:16 UTC 
(rev 34493)
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the NewOS License.
+ */
+
+
+#include "VMUserArea.h"
+
+#include <heap.h>
+#include <vm/vm_priv.h>
+
+
+VMUserArea::VMUserArea(VMAddressSpace* addressSpace, uint32 wiring,
+       uint32 protection)
+       :
+       VMArea(addressSpace, wiring, protection)
+{
+}
+
+
+VMUserArea::~VMUserArea()
+{
+}
+
+
+/*static*/ VMUserArea*
+VMUserArea::Create(VMAddressSpace* addressSpace, const char* name,
+       uint32 wiring, uint32 protection)
+{
+       VMUserArea* area = new(nogrow) VMUserArea(addressSpace, wiring,
+               protection);
+       if (area == NULL)
+               return NULL;
+
+       if (area->Init(name) != B_OK) {
+               delete area;
+               return NULL;
+       }
+
+       return area;
+}
+
+
+/*static*/ VMUserArea*
+VMUserArea::CreateReserved(VMAddressSpace* addressSpace, uint32 flags)
+{
+       VMUserArea* area = new(nogrow) VMUserArea(addressSpace, 0, 0);
+       if (area != NULL)
+               area->id = RESERVED_AREA_ID;
+       return area;
+}

Added: haiku/trunk/src/system/kernel/vm/VMUserArea.h
===================================================================
--- haiku/trunk/src/system/kernel/vm/VMUserArea.h                               
(rev 0)
+++ haiku/trunk/src/system/kernel/vm/VMUserArea.h       2009-12-04 17:07:16 UTC 
(rev 34493)
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx
+ * Distributed under the terms of the NewOS License.
+ */
+#ifndef VM_USER_AREA_H
+#define VM_USER_AREA_H
+
+
+#include <vm/VMArea.h>
+
+
+struct VMUserAddressSpace;
+
+
+struct VMUserArea : VMArea {
+                                                               
VMUserArea(VMAddressSpace* addressSpace,
+                                                                       uint32 
wiring, uint32 protection);
+                                                               ~VMUserArea();
+
+       static  VMUserArea*                     Create(VMAddressSpace* 
addressSpace,
+                                                                       const 
char* name, uint32 wiring,
+                                                                       uint32 
protection);
+       static  VMUserArea*                     CreateReserved(VMAddressSpace* 
addressSpace,
+                                                                       uint32 
flags);
+
+                       DoublyLinkedListLink<VMUserArea>& AddressSpaceLink()
+                                                                       { 
return fAddressSpaceLink; }
+                       const DoublyLinkedListLink<VMUserArea>& 
AddressSpaceLink() const
+                                                                       { 
return fAddressSpaceLink; }
+
+private:
+                       DoublyLinkedListLink<VMUserArea> fAddressSpaceLink;
+};
+
+
+struct VMUserAreaGetLink {
+    inline DoublyLinkedListLink<VMUserArea>* operator()(
+               VMUserArea* area) const
+    {
+        return &area->AddressSpaceLink();
+    }
+
+    inline const DoublyLinkedListLink<VMUserArea>* operator()(
+               const VMUserArea* area) const
+    {
+        return &area->AddressSpaceLink();
+    }
+};
+
+typedef DoublyLinkedList<VMUserArea, VMUserAreaGetLink> VMUserAreaList;
+
+
+#endif // VM_USER_AREA_H

Modified: haiku/trunk/src/system/kernel/vm/vm.cpp
===================================================================
--- haiku/trunk/src/system/kernel/vm/vm.cpp     2009-12-04 14:45:08 UTC (rev 
34492)
+++ haiku/trunk/src/system/kernel/vm/vm.cpp     2009-12-04 17:07:16 UTC (rev 
34493)
@@ -503,7 +503,7 @@
                addressSpec, wiring, protection, _area, areaName));
        cache->AssertLocked();
 
-       VMArea* area = VMArea::Create(addressSpace, areaName, wiring, 
protection);
+       VMArea* area = addressSpace->CreateArea(areaName, wiring, protection);
        if (area == NULL)
                return B_NO_MEMORY;
 
@@ -594,8 +594,7 @@
                sourceCache->Lock();
        }
 err1:
-       free(area->name);
-       free(area);
+       addressSpace->DeleteArea(area);
        return status;
 }
 
@@ -1584,9 +1583,7 @@
        area->cache->RemoveArea(area);
        area->cache->ReleaseRef();
 
-       free(area->page_protections);
-       free(area->name);
-       free(area);
+       addressSpace->DeleteArea(area);
 }
 
 


Other related posts:

  • » [haiku-commits] r34493 - in haiku/trunk: headers/private/kernel/vm src/system/kernel/vm - ingo_weinhold