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 |