diff -r 597aaf25e343 -r e7d2d738d3c2 kernel/eka/kernel/sutils.cpp --- 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)