--- a/kernel/eka/memmodel/emul/win32/mprocess.cpp Fri Mar 12 15:50:11 2010 +0200
+++ b/kernel/eka/memmodel/emul/win32/mprocess.cpp Mon Mar 15 12:45:50 2010 +0200
@@ -191,14 +191,18 @@
TInt count=0;
TInt err = KErrNone;
- data.iDataCopy = Kern::Alloc(seg->iRealDataSize);
- data.iBssCopy = Kern::Alloc(seg->iRealBssSize);
+
+ // Scheduling must be disabled while we are allocating memory from Windows' heap
+ NKern::Lock();
+ data.iDataCopy = GlobalAlloc(GMEM_FIXED, seg->iRealDataSize);
+ data.iBssCopy = GlobalAlloc(GMEM_FIXED, seg->iRealBssSize);
+ NKern::Unlock();
if (!data.iDataCopy || !data.iBssCopy)
{
err = KErrNoMemory;
goto failed;
}
-
+
memcpy(data.iDataCopy, seg->iDataCopy, seg->iRealDataSize); // start with init data
memclr(data.iBssCopy, seg->iRealBssSize); // initialized to zeros
@@ -215,8 +219,11 @@
return KErrNone;
failed:
- Kern::Free(data.iDataCopy);
- Kern::Free(data.iBssCopy);
+ // Scheduling must be disabled while we are freeing memory from Windows' heap
+ NKern::Lock();
+ GlobalFree(data.iDataCopy);
+ GlobalFree(data.iBssCopy);
+ NKern::Unlock();
return err;
}
@@ -245,9 +252,13 @@
if (ix < 0)
return;
-
- Kern::Free(data.iDataCopy);
- Kern::Free(data.iBssCopy);
+
+ // Scheduling must be disabled while we are freeing memory from Windows' heap
+ NKern::Lock();
+ GlobalFree(data.iDataCopy);
+ GlobalFree(data.iBssCopy);
+ NKern::Unlock();
+
__KTRACE_OPT(KDLL,Kern::Printf("Process %O UnmapCodeSeg(%C)", this, aSeg));
}
@@ -261,10 +272,10 @@
NKern::Lock();
if (data.iCodeSeg->iLiveProcess == this)
data.iCodeSeg->iLiveProcess = NULL;
+ iDllData.Remove(ii);
+ GlobalFree(data.iDataCopy);
+ GlobalFree(data.iBssCopy);
NKern::Unlock();
- iDllData.Remove(ii);
- Kern::Free(data.iDataCopy);
- Kern::Free(data.iBssCopy);
}
}