kernel/eka/kernel/sutils.cpp
branchRCL_3
changeset 21 e7d2d738d3c2
parent 14 5d2844f35677
child 42 a179b74831c9
--- a/kernel/eka/kernel/sutils.cpp	Fri Mar 12 15:50:11 2010 +0200
+++ b/kernel/eka/kernel/sutils.cpp	Mon Mar 15 12:45:50 2010 +0200
@@ -2967,12 +2967,17 @@
 		else if (!nt || nt->iCsCount==0)
 			m &= ~MASK_NO_CRITICAL;
 		}
-	if (m & MASK_CRITICAL)
+	if (m & (MASK_CRITICAL|MASK_NO_KILL_OR_SUSPEND))
 		{
 		if (t && (t->iThreadType!=EThreadUser || nt->iCsCount>0))
-			m &= ~MASK_CRITICAL;
+			m &= ~(MASK_CRITICAL|MASK_NO_KILL_OR_SUSPEND);
 		else if (!nt || nt->iCsCount>0)
-			m &= ~MASK_CRITICAL;
+			m &= ~(MASK_CRITICAL|MASK_NO_KILL_OR_SUSPEND);
+		}
+	if (m & MASK_NO_KILL_OR_SUSPEND)
+		{
+		if (!nt || NKern::KernelLocked() || NKern::HeldFastMutex())
+			m &= ~MASK_NO_KILL_OR_SUSPEND;
 		}
 	if (m & MASK_KERNEL_LOCKED)
 		{
@@ -3074,6 +3079,8 @@
 		Kern::Printf("Assertion failed");
 	if (m & MASK_NO_RESCHED)
 		Kern::Printf("Assertion failed: Don't call from thread with kernel unlocked");
+	if (m & MASK_NO_KILL_OR_SUSPEND)
+		Kern::Printf("Assertion failed: Must not be suspended or killed here");
 
 #ifdef __KERNEL_APIS_CONTEXT_CHECKS_FAULT__
 	if (aFunction)