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 "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;i<pageCount;i++)
{
vnode *newVnode=vnodePool.get();
vnode *newVnode=new (vnodePool.get()) vnode;
newVnode->fd=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;i<pageCount;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);
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;i<pageCount;i++)
{
newPage=vpagePool.get();
newPage=new (vpagePool.get()) vpage;
newPage->setup(end_address+PAGE_SIZE*i-1,NULL,NULL,protection,state);
vpages.add(newPage);
}
+2 -1
View File
@@ -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.
}
+2 -1
View File
@@ -1,3 +1,4 @@
#include <new.h>
#include <cacheManager.h>
#include <vpagePool.h>
@@ -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);
+2 -1
View File
@@ -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()); }
+12 -3
View File
@@ -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;i<pages;i++)
unused.add(new page(addOffset(area,i*PAGE_SIZE)));
// unused.add(new page((void *)(i*PAGE_SIZE)));
// Calculate the number of pages that we will need to hold the page structures
int pageOverhead=((pages*sizeof(page))+(PAGE_SIZE-1))/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");
unusedLock=create_sem (1,"unused_lock");
+2 -1
View File
@@ -2,6 +2,7 @@
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <new.h>
#include <vnodePool.h>
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);
+5 -5
View File
@@ -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);
+4 -3
View File
@@ -1,5 +1,6 @@
#include "vmInterface.h"
//#include "areaManager.h"
#include <new.h>
#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);
+6
View File
@@ -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.