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