From c7b613e84e6ab190f4167b259c0549e6fe70e019 Mon Sep 17 00:00:00 2001 From: Michael Phipps Date: Wed, 28 Aug 2002 01:34:19 +0000 Subject: [PATCH] Added explicit placement new. This may be a problem in kernel land, but it basically allows me to manage memory and still use new to setup the object. Fixed the constructors so that objects are properly setup. Tests now run. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@905 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/vm2/area.C | 11 ++++++----- src/kernel/vm2/areaManager.C | 3 ++- src/kernel/vm2/cacheManager.C | 3 ++- src/kernel/vm2/page.h | 3 ++- src/kernel/vm2/pageManager.C | 15 ++++++++++++--- src/kernel/vm2/swapFileManager.C | 3 ++- src/kernel/vm2/test.C | 10 +++++----- src/kernel/vm2/vmInterface.C | 7 ++++--- src/kernel/vm2/vpage.C | 6 ++++++ 9 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/kernel/vm2/area.C b/src/kernel/vm2/area.C index 62f705b858..a06e465f7d 100644 --- a/src/kernel/vm2/area.C +++ b/src/kernel/vm2/area.C @@ -1,3 +1,4 @@ +#include #include "area.h" #include "areaManager.h" #include "vpage.h" @@ -52,11 +53,11 @@ status_t area::createAreaMappingFile(char *inName, int pageCount,void **address, unsigned long base=mapAddressSpecToAddress(type,requested,pageCount); for (int i=0;ifd=fd; newVnode->offset=offset+PAGE_SIZE*i; newVnode->valid=true; - newPage=vpagePool.get(); + newPage=new (vpagePool.get()) vpage; newPage->setup(base+PAGE_SIZE*i,newVnode,NULL,protect,inState); vpages.add(newPage); // printf ("New vnode with fd %d, offset = %d\n",fd,newVnode->offset); @@ -86,7 +87,7 @@ status_t area::createArea(char *inName, int pageCount,void **address, addressSpe for (int i=0;isetup(base+PAGE_SIZE*i,NULL,NULL,protect,inState); vpages.add(newPage); } @@ -118,7 +119,7 @@ status_t area::cloneArea(area *origArea, char *inName, void **address, addressSp { vpage *newPage,*page=(vpage *)cur; // Cloned area has the same physical page and backing store... - newPage=vpagePool.get(); + newPage=new (vpagePool.get()) vpage; newPage->setup(base,page->getBacking(),page->getPhysPage(),protect,inState); vpages.add(newPage); base+=PAGE_SIZE; @@ -202,7 +203,7 @@ status_t area::resize(size_t newSize) vpage *newPage; for (int i=0;isetup(end_address+PAGE_SIZE*i-1,NULL,NULL,protection,state); vpages.add(newPage); } diff --git a/src/kernel/vm2/areaManager.C b/src/kernel/vm2/areaManager.C index a92918b553..d7f6eff370 100644 --- a/src/kernel/vm2/areaManager.C +++ b/src/kernel/vm2/areaManager.C @@ -1,8 +1,9 @@ #include "areaManager.h" areaManager::areaManager(void) -{ +{ team=0; // should be proc_get_current_proc_id() + myLock=0; myLock=create_sem(1,"Area Manager Semaphore"); // Should have team name in it. } diff --git a/src/kernel/vm2/cacheManager.C b/src/kernel/vm2/cacheManager.C index 1ac64504d4..4e7bc4f7c5 100644 --- a/src/kernel/vm2/cacheManager.C +++ b/src/kernel/vm2/cacheManager.C @@ -1,3 +1,4 @@ +#include #include #include @@ -36,7 +37,7 @@ void *cacheManager::createBlock(vnode *target,bool readOnly) } lock(); // Create a vnode here - vpage *newPage = vpagePool.get(); + vpage *newPage = new (vpagePool.get()) vpage; newPage->setup(begin,target,NULL,((readOnly)?readable:writable),NO_LOCK); vpages.add(newPage); cacheMembers.add(newPage); diff --git a/src/kernel/vm2/page.h b/src/kernel/vm2/page.h index 9a886e9793..8d655bf35d 100644 --- a/src/kernel/vm2/page.h +++ b/src/kernel/vm2/page.h @@ -8,7 +8,8 @@ class page : public node { void *physicalAddress; public: int count; - page(void *address) : physicalAddress(address) {count=0;} ; + page(void) {cpuSpecific=NULL;physicalAddress=NULL;}; + void setup (void *address) {count=0;physicalAddress=address;}; void zero(void); unsigned long getAddress(void) {return (unsigned long)physicalAddress;} void dump(void) { printf ("Page %x, physicalAddress = %x\n",this,getAddress()); } diff --git a/src/kernel/vm2/pageManager.C b/src/kernel/vm2/pageManager.C index 3960e387be..e1f46fbd1c 100644 --- a/src/kernel/vm2/pageManager.C +++ b/src/kernel/vm2/pageManager.C @@ -6,6 +6,7 @@ void *addOffset(void *base,unsigned long offset) { return (void *)(((unsigned long)base+offset)); } + pageManager::pageManager(int pages) { // This is compatability for in BeOS usage only... @@ -16,9 +17,17 @@ pageManager::pageManager(int pages) exit(1); } printf ("Allocated an area. Address = %x\n",area); - for (int i=0;isetup(addOffset(area,(i+pageOverhead)*PAGE_SIZE)); + printf ("newPage = %x, setup = %x\n",newPage,addOffset(area,(i+pageOverhead)*PAGE_SIZE)); + printf ("i = %d, sizeof(page) = %x, pageOverhead = %d\n",i,sizeof(page),pageOverhead); + newPage->dump(); + unused.add(addOffset(area,i*sizeof(page))); + } cleanLock=create_sem (1,"clean_lock"); unusedLock=create_sem (1,"unused_lock"); diff --git a/src/kernel/vm2/swapFileManager.C b/src/kernel/vm2/swapFileManager.C index d51002900f..5bbeba4e59 100644 --- a/src/kernel/vm2/swapFileManager.C +++ b/src/kernel/vm2/swapFileManager.C @@ -2,6 +2,7 @@ #include #include #include +#include #include extern poolvnode vnodePool; @@ -47,7 +48,7 @@ vnode &swapFileManager::findNode(void) Unlock(); if (!newNode) { - newNode=vnodePool.get(); + newNode=new (vnodePool.get()) vnode; newNode->fd=swapFile; newNode->offset=maxNode+=PAGE_SIZE; //printf (" New One: %d\n",newNode->offset); diff --git a/src/kernel/vm2/test.C b/src/kernel/vm2/test.C index c23ce611fe..829d8731ac 100644 --- a/src/kernel/vm2/test.C +++ b/src/kernel/vm2/test.C @@ -153,12 +153,12 @@ int main(int argc,char **argv) loopTestParameters mmap1Params={"mmap",500000,8192,400000,1000000}; loopTestParameters clone1Params={"clone1",200000,2,300000,400000}; - //resume_thread(spawn_thread(loopTest,"area test 1",0,&area1Params)); - //resume_thread(spawn_thread(loopTest,"area test 2",0,&area2Params)); - //resume_thread(spawn_thread(loopTest,"area test 3",0,&area3Params)); - //resume_thread(spawn_thread(getInfoTest,"info test 1",0,&info1Params)); + resume_thread(spawn_thread(loopTest,"area test 1",0,&area1Params)); + resume_thread(spawn_thread(loopTest,"area test 2",0,&area2Params)); + resume_thread(spawn_thread(loopTest,"area test 3",0,&area3Params)); + resume_thread(spawn_thread(getInfoTest,"info test 1",0,&info1Params)); resume_thread(spawn_thread(mmapTest,"mmap test 1",0,&mmap1Params)); - //resume_thread(spawn_thread(cloneTest,"clone test 1",0,&clone1Params)); + resume_thread(spawn_thread(cloneTest,"clone test 1",0,&clone1Params)); snooze(1000000000); diff --git a/src/kernel/vm2/vmInterface.C b/src/kernel/vm2/vmInterface.C index f9e0f3c48d..bcd55e3265 100644 --- a/src/kernel/vm2/vmInterface.C +++ b/src/kernel/vm2/vmInterface.C @@ -1,5 +1,6 @@ #include "vmInterface.h" //#include "areaManager.h" +#include #include "mman.h" #include "area.h" #include "areaPool.h" @@ -85,7 +86,7 @@ status_t vmInterface::resizeArea(int Area,size_t size) int vmInterface::createArea(char *AreaName,int pageCount,void **address, addressSpec addType,pageState state,protectType protect) { - area *newArea = areaPool.get(); + area *newArea = new (areaPool.get()) area; newArea->setup(getAM()); newArea->createArea(AreaName,pageCount,address,addType,state,protect); newArea->setAreaID(nextAreaID++); // THIS IS NOT THREAD SAFE @@ -139,7 +140,7 @@ int vmInterface::getAreaByName(char *name) int vmInterface::cloneArea(int newAreaID,char *AreaName,void **address, addressSpec addType=ANY, pageState state=NO_LOCK, protectType prot=writable) { - area *newArea = areaPool.get(); + area *newArea = new (areaPool.get()) area; newArea->setup(getAM()); area *oldArea=getAM()->findArea(newAreaID); newArea->cloneArea(oldArea,AreaName,address,addType,state,prot); @@ -190,7 +191,7 @@ void *vmInterface::mmap(void *addr, size_t len, int prot, int flags, int fd, off return addr; } - area *newArea = areaPool.get(); + area *newArea = new (areaPool.get()) area; newArea->setup(getAM()); //printf ("area = %x, start = %x\n",newArea, newArea->getStartAddress()); newArea->createAreaMappingFile(name,(int)((len+PAGE_SIZE-1)/PAGE_SIZE),&addr,addType,LAZY,protType,fd,offset); diff --git a/src/kernel/vm2/vpage.C b/src/kernel/vm2/vpage.C index cc4a85b220..fc90542afb 100644 --- a/src/kernel/vm2/vpage.C +++ b/src/kernel/vm2/vpage.C @@ -18,6 +18,12 @@ void vpage::refresh(void) vpage::vpage(void) { + physPage=NULL; + backingNode=NULL; + protection=none; + dirty=false; + swappable=false; + start_address=end_address=0; } // backing and/or physMem can be NULL/0.