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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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()); }
|
||||||
|
|||||||
@@ -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,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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user