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
This commit is contained in:
Michael Phipps
2002-08-28 01:34:19 +00:00
parent bffaf34afe
commit c7b613e84e
9 changed files with 41 additions and 20 deletions
+6 -5
View File
@@ -1,3 +1,4 @@
#include <new.h>
#include "area.h" #include "area.h"
#include "areaManager.h" #include "areaManager.h"
#include "vpage.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); unsigned long base=mapAddressSpecToAddress(type,requested,pageCount);
for (int i=0;i<pageCount;i++) for (int i=0;i<pageCount;i++)
{ {
vnode *newVnode=vnodePool.get(); vnode *newVnode=new (vnodePool.get()) vnode;
newVnode->fd=fd; newVnode->fd=fd;
newVnode->offset=offset+PAGE_SIZE*i; newVnode->offset=offset+PAGE_SIZE*i;
newVnode->valid=true; newVnode->valid=true;
newPage=vpagePool.get(); newPage=new (vpagePool.get()) vpage;
newPage->setup(base+PAGE_SIZE*i,newVnode,NULL,protect,inState); newPage->setup(base+PAGE_SIZE*i,newVnode,NULL,protect,inState);
vpages.add(newPage); vpages.add(newPage);
// printf ("New vnode with fd %d, offset = %d\n",fd,newVnode->offset); // 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;i<pageCount;i++) for (int i=0;i<pageCount;i++)
{ {
//printf ("in area::createArea: creating page = %d\n",i); //printf ("in area::createArea: creating page = %d\n",i);
newPage=vpagePool.get(); newPage=new (vpagePool.get()) vpage;
newPage->setup(base+PAGE_SIZE*i,NULL,NULL,protect,inState); newPage->setup(base+PAGE_SIZE*i,NULL,NULL,protect,inState);
vpages.add(newPage); vpages.add(newPage);
} }
@@ -118,7 +119,7 @@ status_t area::cloneArea(area *origArea, char *inName, void **address, addressSp
{ {
vpage *newPage,*page=(vpage *)cur; vpage *newPage,*page=(vpage *)cur;
// Cloned area has the same physical page and backing store... // 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); newPage->setup(base,page->getBacking(),page->getPhysPage(),protect,inState);
vpages.add(newPage); vpages.add(newPage);
base+=PAGE_SIZE; base+=PAGE_SIZE;
@@ -202,7 +203,7 @@ status_t area::resize(size_t newSize)
vpage *newPage; vpage *newPage;
for (int i=0;i<pageCount;i++) for (int i=0;i<pageCount;i++)
{ {
newPage=vpagePool.get(); newPage=new (vpagePool.get()) vpage;
newPage->setup(end_address+PAGE_SIZE*i-1,NULL,NULL,protection,state); newPage->setup(end_address+PAGE_SIZE*i-1,NULL,NULL,protection,state);
vpages.add(newPage); vpages.add(newPage);
} }
+2 -1
View File
@@ -1,8 +1,9 @@
#include "areaManager.h" #include "areaManager.h"
areaManager::areaManager(void) areaManager::areaManager(void)
{ {
team=0; // should be proc_get_current_proc_id() team=0; // should be proc_get_current_proc_id()
myLock=0;
myLock=create_sem(1,"Area Manager Semaphore"); // Should have team name in it. myLock=create_sem(1,"Area Manager Semaphore"); // Should have team name in it.
} }
+2 -1
View File
@@ -1,3 +1,4 @@
#include <new.h>
#include <cacheManager.h> #include <cacheManager.h>
#include <vpagePool.h> #include <vpagePool.h>
@@ -36,7 +37,7 @@ void *cacheManager::createBlock(vnode *target,bool readOnly)
} }
lock(); lock();
// Create a vnode here // Create a vnode here
vpage *newPage = vpagePool.get(); vpage *newPage = new (vpagePool.get()) vpage;
newPage->setup(begin,target,NULL,((readOnly)?readable:writable),NO_LOCK); newPage->setup(begin,target,NULL,((readOnly)?readable:writable),NO_LOCK);
vpages.add(newPage); vpages.add(newPage);
cacheMembers.add(newPage); cacheMembers.add(newPage);
+2 -1
View File
@@ -8,7 +8,8 @@ class page : public node {
void *physicalAddress; void *physicalAddress;
public: public:
int count; 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); void zero(void);
unsigned long getAddress(void) {return (unsigned long)physicalAddress;} unsigned long getAddress(void) {return (unsigned long)physicalAddress;}
void dump(void) { printf ("Page %x, physicalAddress = %x\n",this,getAddress()); } void dump(void) { printf ("Page %x, physicalAddress = %x\n",this,getAddress()); }
+12 -3
View File
@@ -6,6 +6,7 @@ void *addOffset(void *base,unsigned long offset)
{ {
return (void *)(((unsigned long)base+offset)); return (void *)(((unsigned long)base+offset));
} }
pageManager::pageManager(int pages) pageManager::pageManager(int pages)
{ {
// This is compatability for in BeOS usage only... // This is compatability for in BeOS usage only...
@@ -16,9 +17,17 @@ pageManager::pageManager(int pages)
exit(1); exit(1);
} }
printf ("Allocated an area. Address = %x\n",area); printf ("Allocated an area. Address = %x\n",area);
for (int i=0;i<pages;i++) // Calculate the number of pages that we will need to hold the page structures
unused.add(new page(addOffset(area,i*PAGE_SIZE))); int pageOverhead=((pages*sizeof(page))+(PAGE_SIZE-1))/PAGE_SIZE;
// unused.add(new page((void *)(i*PAGE_SIZE))); for (int i=0;i<pages-pageOverhead;i++)
{
page *newPage=(page *)(addOffset(area,i*sizeof(page)));
newPage->setup(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"); cleanLock=create_sem (1,"clean_lock");
unusedLock=create_sem (1,"unused_lock"); unusedLock=create_sem (1,"unused_lock");
+2 -1
View File
@@ -2,6 +2,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <new.h>
#include <vnodePool.h> #include <vnodePool.h>
extern poolvnode vnodePool; extern poolvnode vnodePool;
@@ -47,7 +48,7 @@ vnode &swapFileManager::findNode(void)
Unlock(); Unlock();
if (!newNode) if (!newNode)
{ {
newNode=vnodePool.get(); newNode=new (vnodePool.get()) vnode;
newNode->fd=swapFile; newNode->fd=swapFile;
newNode->offset=maxNode+=PAGE_SIZE; newNode->offset=maxNode+=PAGE_SIZE;
//printf (" New One: %d\n",newNode->offset); //printf (" New One: %d\n",newNode->offset);
+5 -5
View File
@@ -153,12 +153,12 @@ int main(int argc,char **argv)
loopTestParameters mmap1Params={"mmap",500000,8192,400000,1000000}; loopTestParameters mmap1Params={"mmap",500000,8192,400000,1000000};
loopTestParameters clone1Params={"clone1",200000,2,300000,400000}; loopTestParameters clone1Params={"clone1",200000,2,300000,400000};
//resume_thread(spawn_thread(loopTest,"area test 1",0,&area1Params)); 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 2",0,&area2Params));
//resume_thread(spawn_thread(loopTest,"area test 3",0,&area3Params)); resume_thread(spawn_thread(loopTest,"area test 3",0,&area3Params));
//resume_thread(spawn_thread(getInfoTest,"info test 1",0,&info1Params)); resume_thread(spawn_thread(getInfoTest,"info test 1",0,&info1Params));
resume_thread(spawn_thread(mmapTest,"mmap test 1",0,&mmap1Params)); 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); snooze(1000000000);
+4 -3
View File
@@ -1,5 +1,6 @@
#include "vmInterface.h" #include "vmInterface.h"
//#include "areaManager.h" //#include "areaManager.h"
#include <new.h>
#include "mman.h" #include "mman.h"
#include "area.h" #include "area.h"
#include "areaPool.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) 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->setup(getAM());
newArea->createArea(AreaName,pageCount,address,addType,state,protect); newArea->createArea(AreaName,pageCount,address,addType,state,protect);
newArea->setAreaID(nextAreaID++); // THIS IS NOT THREAD SAFE 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) 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()); newArea->setup(getAM());
area *oldArea=getAM()->findArea(newAreaID); area *oldArea=getAM()->findArea(newAreaID);
newArea->cloneArea(oldArea,AreaName,address,addType,state,prot); 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; return addr;
} }
area *newArea = areaPool.get(); area *newArea = new (areaPool.get()) area;
newArea->setup(getAM()); newArea->setup(getAM());
//printf ("area = %x, start = %x\n",newArea, newArea->getStartAddress()); //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); newArea->createAreaMappingFile(name,(int)((len+PAGE_SIZE-1)/PAGE_SIZE),&addr,addType,LAZY,protType,fd,offset);
+6
View File
@@ -18,6 +18,12 @@ void vpage::refresh(void)
vpage::vpage(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. // backing and/or physMem can be NULL/0.