kernel/eka/nkernsmp/dfcs.cpp
changeset 90 947f0dc9f7a8
parent 0 a41df078684a
child 257 3e88ff8f41d5
equal deleted inserted replaced
52:2d65c2f76d7b 90:947f0dc9f7a8
   763 						ss->iExIDfcPendingFlag = TRUE;
   763 						ss->iExIDfcPendingFlag = TRUE;
   764 						ss->iExIDfcs.Add(d);
   764 						ss->iExIDfcs.Add(d);
   765 						}
   765 						}
   766 					ss->iExIDfcLock.UnlockOnly();
   766 					ss->iExIDfcLock.UnlockOnly();
   767 					if (kick)
   767 					if (kick)
       
   768 						{
       
   769 						TScheduler& s = TheScheduler;
       
   770 						TUint32 cpuMask = 1u<<cpu;
       
   771 						if (!(s.iThreadAcceptCpus & cpuMask))	// deal with case where target CPU is shutting down or has already shut down
       
   772 							{
       
   773 							TInt irq = s.iGenIPILock.LockIrqSave();
       
   774 							if (!(s.iIpiAcceptCpus & cpuMask))
       
   775 								{
       
   776 								s.iCCReactivateCpus |= cpuMask;
       
   777 								kick = FALSE;
       
   778 								}
       
   779 							s.iGenIPILock.UnlockIrqRestore(irq);
       
   780 							if (!kick)
       
   781 								s.iCCReactivateDfc.DoEnque();	// arrange for target CPU to be powered on
       
   782 							}
       
   783 						}
       
   784 					if (kick)
   768 						send_resched_ipi(cpu);
   785 						send_resched_ipi(cpu);
   769 					NKern::EnableAllInterrupts();	// let interrupts in
   786 					NKern::EnableAllInterrupts();	// let interrupts in
   770 					if (orig >= 8)
   787 					if (orig >= 8)
   771 						tied->EndTiedEvent();		// IDFC cancelled so release tied thread/group
   788 						tied->EndTiedEvent();		// IDFC cancelled so release tied thread/group
   772 					continue;
   789 					continue;