kernel/eka/memmodel/epoc/flexible/mmu/mobject.cpp
branchRCL_3
changeset 19 4a8fed1c0ef6
parent 6 0173bcd7697c
child 20 597aaf25e343
equal deleted inserted replaced
15:2d65c2f76d7b 19:4a8fed1c0ef6
   504 	TUint numPts = aNumPages>>(KChunkShift-KPageShift);
   504 	TUint numPts = aNumPages>>(KChunkShift-KPageShift);
   505 	DPageTables* self = (DPageTables*)Kern::AllocZ(sizeof(DPageTables)+(numPts-1)*sizeof(TPte*));
   505 	DPageTables* self = (DPageTables*)Kern::AllocZ(sizeof(DPageTables)+(numPts-1)*sizeof(TPte*));
   506 	if(self)
   506 	if(self)
   507 		{
   507 		{
   508 		new (self) DPageTables(aMemory,numPts,aPteType);
   508 		new (self) DPageTables(aMemory,numPts,aPteType);
       
   509 		// Add this page tables object to the memory object before we update any 
       
   510 		// page table entries. To ensure that if any of aMemory's pages with 
       
   511 		// corresponding page table entries in self are moved during Construct(), 
       
   512 		// DCoarseMemory::RemapPage() will be able to find the page table entries 
       
   513 		// to update via iPageTables.
       
   514 		__NK_ASSERT_DEBUG(!aMemory->iPageTables[aPteType]);
       
   515 		aMemory->iPageTables[aPteType] = self;
   509 		TInt r = self->Construct();
   516 		TInt r = self->Construct();
   510 		if(r!=KErrNone)
   517 		if(r!=KErrNone)
   511 			{
   518 			{
       
   519 			aMemory->iPageTables[aPteType] = 0;
   512 			self->Close();
   520 			self->Close();
   513 			self = 0;
   521 			self = 0;
   514 			}
   522 			}
   515 		}
   523 		}
   516 	TRACE2(("DCoarseMemory::DPageTables::New(0x%08x,0x%x,0x%08x) returns 0x%08x",aMemory, aNumPages, aPteType, self));
   524 	TRACE2(("DCoarseMemory::DPageTables::New(0x%08x,0x%x,0x%08x) returns 0x%08x",aMemory, aNumPages, aPteType, self));
  1687 
  1695 
  1688 	if(!tables)
  1696 	if(!tables)
  1689 		{
  1697 		{
  1690 		// allocate a new one if required...
  1698 		// allocate a new one if required...
  1691 		tables = DPageTables::New(this, iSizeInPages, aPteType);
  1699 		tables = DPageTables::New(this, iSizeInPages, aPteType);
  1692 		if (tables)
       
  1693 			{
       
  1694 			__NK_ASSERT_DEBUG(!iPageTables[aPteType]);
       
  1695 			iPageTables[aPteType] = tables;
       
  1696 			}
       
  1697 		}		
  1700 		}		
  1698 
  1701 
  1699 	return tables;
  1702 	return tables;
  1700 	}
  1703 	}
  1701 
  1704