kernel/eka/euser/us_test.cpp
changeset 293 0659d0e1a03c
parent 90 947f0dc9f7a8
--- a/kernel/eka/euser/us_test.cpp	Mon Oct 18 15:31:10 2010 +0100
+++ b/kernel/eka/euser/us_test.cpp	Wed Oct 20 13:58:28 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 1994-2010 Nokia Corporation and/or its subsidiary(-ies).
 // All rights reserved.
 // This component and the accompanying materials are made available
 // under the terms of the License "Eclipse Public License v1.0"
@@ -561,3 +561,48 @@
 	}
 
 
+/**
+This should be called before using the __KHEAP_MARK macro in tests that check for
+kernel heap leaks.
+
+It will complete deferred background tasks that would ordinarily run at some point after boot
+and that would lead to kernel heap allocs/deallocs. For example, unload of lazily loaded DLLs
+and running the reaper.
+*/
+EXPORT_C TInt RTest::CompletePostBootSystemTasks()
+	{
+	RLoader l;
+	TInt r = l.Connect();
+	if(r != KErrNone)
+		{
+		Printf(_L("RTEST: Error %d while connecting to loader.\n"), r);
+		return r;
+		}
+
+	r = l.CancelLazyDllUnload();
+	if(r != KErrNone)
+		{
+		l.Close();
+		Printf(_L("RTEST: Error %d while canceling Lazy Dll unloading.\n"), r);
+		return r;
+		}
+
+	r = l.RunReaper();
+	l.Close();
+
+	if(r != KErrNone)
+		{
+		Printf(_L("RTEST: Error %d while running the reaper.\n"),r);
+		return r;
+		}
+
+	// Ensure that any kernel objects asynchronously deleted after the
+	// above get fully deleted.
+	r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalSupervisorBarrier, 0, 0);
+	if(r != KErrNone)
+		{
+		Printf(_L("RTEST: Error %d while attempting to asynchronously delete kernel objects.\n"),r);
+		}
+	return r;
+	}
+