kernel/eka/memmodel/emul/win32/mprocess.cpp
branchRCL_3
changeset 21 e7d2d738d3c2
parent 0 a41df078684a
--- 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);
 		}
 	}