diff -r 597aaf25e343 -r e7d2d738d3c2 kernel/eka/memmodel/emul/win32/mprocess.cpp --- 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); } }