kernel/eka/kernel/sthread.cpp
branchRCL_3
changeset 39 2bb754abd467
parent 8 538db54a451d
child 43 c1f20ce4abcf
--- a/kernel/eka/kernel/sthread.cpp	Wed Jun 09 11:10:19 2010 +0300
+++ b/kernel/eka/kernel/sthread.cpp	Mon Jun 21 17:12:14 2010 +0300
@@ -114,8 +114,23 @@
 	iTls.Close();
 	if (iSyncMsgPtr)
 		{
-		__KTRACE_OPT(KSERVER,Kern::Printf("DThread::Destruct(%08X) freeing sync message at %08X", this, iSyncMsgPtr));
-		iSyncMsgPtr->ReleaseMessagePool(RMessageK::ESync, 1);
+		// The sync message might still be outstanding; in particular it may be
+		// on the kernel server's list of messages to be cleaned up on behalf of
+		// dead clients. So we only release it here if it's free; otherwise, we
+		// mutate the type, so that cleanup will return it to the Global pool.
+		NKern::LockSystem();
+		if (iSyncMsgPtr->IsFree())
+			{
+			NKern::UnlockSystem();
+			__KTRACE_OPT(KSERVER,Kern::Printf("DThread::Destruct(%08X) releasing sync message at %08X", this, iSyncMsgPtr));
+			iSyncMsgPtr->ReleaseMessagePool(RMessageK::ESync, 1);
+			}
+		else
+			{
+			__KTRACE_OPT(KSERVER,Kern::Printf("DThread::Destruct(%08X) mutating sync message at %08X", this, iSyncMsgPtr));
+			iSyncMsgPtr->iMsgType = RMessageK::EGlobal;
+			NKern::UnlockSystem();
+			}
 		iSyncMsgPtr = NULL;
 		}
 	FreeSupervisorStack();