equal
deleted
inserted
replaced
189 SProcessDllDataBlock data; |
189 SProcessDllDataBlock data; |
190 data.iCodeSeg = seg; |
190 data.iCodeSeg = seg; |
191 |
191 |
192 TInt count=0; |
192 TInt count=0; |
193 TInt err = KErrNone; |
193 TInt err = KErrNone; |
194 data.iDataCopy = Kern::Alloc(seg->iRealDataSize); |
194 |
195 data.iBssCopy = Kern::Alloc(seg->iRealBssSize); |
195 // Scheduling must be disabled while we are allocating memory from Windows' heap |
|
196 NKern::Lock(); |
|
197 data.iDataCopy = GlobalAlloc(GMEM_FIXED, seg->iRealDataSize); |
|
198 data.iBssCopy = GlobalAlloc(GMEM_FIXED, seg->iRealBssSize); |
|
199 NKern::Unlock(); |
196 if (!data.iDataCopy || !data.iBssCopy) |
200 if (!data.iDataCopy || !data.iBssCopy) |
197 { |
201 { |
198 err = KErrNoMemory; |
202 err = KErrNoMemory; |
199 goto failed; |
203 goto failed; |
200 } |
204 } |
201 |
205 |
202 memcpy(data.iDataCopy, seg->iDataCopy, seg->iRealDataSize); // start with init data |
206 memcpy(data.iDataCopy, seg->iDataCopy, seg->iRealDataSize); // start with init data |
203 memclr(data.iBssCopy, seg->iRealBssSize); // initialized to zeros |
207 memclr(data.iBssCopy, seg->iRealBssSize); // initialized to zeros |
204 |
208 |
205 NKern::Lock(); |
209 NKern::Lock(); |
206 count = iDllData.Count(); |
210 count = iDllData.Count(); |
213 goto failed; |
217 goto failed; |
214 |
218 |
215 return KErrNone; |
219 return KErrNone; |
216 |
220 |
217 failed: |
221 failed: |
218 Kern::Free(data.iDataCopy); |
222 // Scheduling must be disabled while we are freeing memory from Windows' heap |
219 Kern::Free(data.iBssCopy); |
223 NKern::Lock(); |
|
224 GlobalFree(data.iDataCopy); |
|
225 GlobalFree(data.iBssCopy); |
|
226 NKern::Unlock(); |
220 |
227 |
221 return err; |
228 return err; |
222 } |
229 } |
223 |
230 |
224 void DWin32Process::UnmapCodeSeg(DCodeSeg* aSeg) |
231 void DWin32Process::UnmapCodeSeg(DCodeSeg* aSeg) |
243 } |
250 } |
244 NKern::Unlock(); |
251 NKern::Unlock(); |
245 |
252 |
246 if (ix < 0) |
253 if (ix < 0) |
247 return; |
254 return; |
248 |
255 |
249 Kern::Free(data.iDataCopy); |
256 // Scheduling must be disabled while we are freeing memory from Windows' heap |
250 Kern::Free(data.iBssCopy); |
257 NKern::Lock(); |
|
258 GlobalFree(data.iDataCopy); |
|
259 GlobalFree(data.iBssCopy); |
|
260 NKern::Unlock(); |
|
261 |
251 __KTRACE_OPT(KDLL,Kern::Printf("Process %O UnmapCodeSeg(%C)", this, aSeg)); |
262 __KTRACE_OPT(KDLL,Kern::Printf("Process %O UnmapCodeSeg(%C)", this, aSeg)); |
252 } |
263 } |
253 |
264 |
254 void DWin32Process::RemoveDllData() |
265 void DWin32Process::RemoveDllData() |
255 { |
266 { |
259 { |
270 { |
260 SProcessDllDataBlock data = iDllData[ii]; |
271 SProcessDllDataBlock data = iDllData[ii]; |
261 NKern::Lock(); |
272 NKern::Lock(); |
262 if (data.iCodeSeg->iLiveProcess == this) |
273 if (data.iCodeSeg->iLiveProcess == this) |
263 data.iCodeSeg->iLiveProcess = NULL; |
274 data.iCodeSeg->iLiveProcess = NULL; |
|
275 iDllData.Remove(ii); |
|
276 GlobalFree(data.iDataCopy); |
|
277 GlobalFree(data.iBssCopy); |
264 NKern::Unlock(); |
278 NKern::Unlock(); |
265 iDllData.Remove(ii); |
|
266 Kern::Free(data.iDataCopy); |
|
267 Kern::Free(data.iBssCopy); |
|
268 } |
279 } |
269 } |
280 } |
270 |
281 |
271 TInt DWin32Process::AttachExistingCodeSeg(TProcessCreateInfo& /*aInfo*/) |
282 TInt DWin32Process::AttachExistingCodeSeg(TProcessCreateInfo& /*aInfo*/) |
272 { |
283 { |