kernel/eka/memmodel/emul/win32/mprocess.cpp
branchRCL_3
changeset 21 e7d2d738d3c2
parent 0 a41df078684a
equal deleted inserted replaced
20:597aaf25e343 21:e7d2d738d3c2
   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 	{