kernel/eka/memmodel/epoc/flexible/mprocess.cpp
branchanywhere
changeset 41 d32f34975bbf
parent 36 538db54a451d
equal deleted inserted replaced
40:04a1b74efd48 41:d32f34975bbf
    54 	delete iSharedChunks;
    54 	delete iSharedChunks;
    55 
    55 
    56 	DProcess::Destruct();
    56 	DProcess::Destruct();
    57 	}
    57 	}
    58 
    58 
       
    59 
    59 TInt DMemModelProcess::TryOpenOsAsid()
    60 TInt DMemModelProcess::TryOpenOsAsid()
    60 	{
    61 	{
    61 	if (__e32_atomic_tas_ord32(&iOsAsidRefCount, 1, 1, 0))
    62 	if (__e32_atomic_tas_ord32(&iOsAsidRefCount, 1, 1, 0))
    62 		{
    63 		{
    63 		return iOsAsid;
    64 		return iOsAsid;
    64 		}
    65 		}
    65 	return KErrDied;
    66 	return KErrDied;
    66 	}
    67 	}
       
    68 
    67 
    69 
    68 void DMemModelProcess::CloseOsAsid()
    70 void DMemModelProcess::CloseOsAsid()
    69 	{
    71 	{
    70 	if (__e32_atomic_tas_ord32(&iOsAsidRefCount, 1, -1, 0) == 1)
    72 	if (__e32_atomic_tas_ord32(&iOsAsidRefCount, 1, -1, 0) == 1)
    71 		{// Last reference has been closed so free the asid.
    73 		{// Last reference has been closed so free the asid.
    72 		MM::AddressSpaceFree(iOsAsid);
    74 		MM::AddressSpaceFree(iOsAsid);
    73 		}
    75 		}
    74 	}
    76 	}
    75 
    77 
       
    78 
    76 void DMemModelProcess::AsyncCloseOsAsid()
    79 void DMemModelProcess::AsyncCloseOsAsid()
    77 	{
    80 	{
    78 	if (__e32_atomic_tas_ord32(&iOsAsidRefCount, 1, -1, 0) == 1)
    81 	if (__e32_atomic_tas_ord32(&iOsAsidRefCount, 1, -1, 0) == 1)
    79 		{// Last reference has been closed so free the asid asynchronusly.
    82 		{// Last reference has been closed so free the asid asynchronusly.
    80 		MM::AsyncAddressSpaceFree(iOsAsid);
    83 		MM::AsyncAddressSpaceFree(iOsAsid);
    81 		}
    84 		}
    82 	}
    85 	}
       
    86 
    83 
    87 
    84 TInt DMemModelProcess::NewChunk(DChunk*& aChunk, SChunkCreateInfo& aInfo, TLinAddr& aRunAddr)
    88 TInt DMemModelProcess::NewChunk(DChunk*& aChunk, SChunkCreateInfo& aInfo, TLinAddr& aRunAddr)
    85 	{
    89 	{
    86 	aChunk=NULL;
    90 	aChunk=NULL;
    87 
    91 
   939 
   943 
   940 		CHECK_PAGING_SAFE;
   944 		CHECK_PAGING_SAFE;
   941 
   945 
   942 		if(aFlags&KCheckLocalAddress)
   946 		if(aFlags&KCheckLocalAddress)
   943 			MM::ValidateLocalIpcAddress(dest,alias_size,ETrue);
   947 			MM::ValidateLocalIpcAddress(dest,alias_size,ETrue);
       
   948 		UNLOCK_USER_MEMORY();
   944 		memcpy( (TAny*)dest, (const TAny*)alias_src, alias_size);
   949 		memcpy( (TAny*)dest, (const TAny*)alias_src, alias_size);
       
   950 		LOCK_USER_MEMORY();
   945 
   951 
   946 		src+=alias_size;
   952 		src+=alias_size;
   947 		dest+=alias_size;
   953 		dest+=alias_size;
   948 		aLength-=alias_size;
   954 		aLength-=alias_size;
   949 
   955 
  1016 		CHECK_PAGING_SAFE_RANGE(src, aLength);
  1022 		CHECK_PAGING_SAFE_RANGE(src, aLength);
  1017 		CHECK_DATA_PAGING_SAFE_RANGE(dest, aLength);
  1023 		CHECK_DATA_PAGING_SAFE_RANGE(dest, aLength);
  1018 
  1024 
  1019 		if(aFlags&KCheckLocalAddress)
  1025 		if(aFlags&KCheckLocalAddress)
  1020 			MM::ValidateLocalIpcAddress(src,alias_size,EFalse);
  1026 			MM::ValidateLocalIpcAddress(src,alias_size,EFalse);
       
  1027 		UNLOCK_USER_MEMORY();
  1021 		memcpy( (TAny*)alias_dest, (const TAny*)src, alias_size);
  1028 		memcpy( (TAny*)alias_dest, (const TAny*)src, alias_size);
       
  1029 		LOCK_USER_MEMORY();
  1022 
  1030 
  1023 		src+=alias_size;
  1031 		src+=alias_size;
  1024 		dest+=alias_size;
  1032 		dest+=alias_size;
  1025 		aLength-=alias_size;
  1033 		aLength-=alias_size;
  1026 
  1034