--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/demandpaging/t_dpcmn.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,188 @@
+// Copyright (c) 2008-2009 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"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32test\demandpaging\t_dpcmn.cpp
+//
+//
+
+#include <e32test.h>
+#include <dptest.h>
+#include <e32hal.h>
+#include <u32exec.h>
+#include <e32svr.h>
+#include <e32panic.h>
+#include "u32std.h"
+
+TInt gPageSize;
+TBool gPagingSupported = EFalse;
+TBool gRomPagingSupported = EFalse;
+TBool gCodePagingSupported = EFalse;
+TBool gDataPagingSupported = EFalse;
+TInt gDataPagingPolicy;
+TBool gProcessPaged;
+
+TBool gGlobalNoPaging = EFalse;
+TBool gGlobalAlwaysPage = EFalse;
+TBool gGlobalDefaultUnpaged = EFalse;
+TBool gGlobalDefaultPage = EFalse;
+
+// Size of paging cache in pages
+TUint gMinCacheSize = 0;
+TUint gMaxCacheSize = 0;
+TUint gCurrentCacheSize = 0;
+
+RChunk gChunk;
+
+//
+// GetGlobalPolicies
+//
+// Determine the global dapaging policies as specified at rombuild time
+//
+TInt GetGlobalPolicies()
+ {
+ // Determine which types of paging are supported
+ TUint32 attrs = DPTest::Attributes();
+
+ gRomPagingSupported = (attrs & DPTest::ERomPaging) != 0;
+ gCodePagingSupported = (attrs & DPTest::ECodePaging) != 0;
+ gDataPagingSupported = (attrs & DPTest::EDataPaging) != 0;
+ gPagingSupported = gRomPagingSupported || gCodePagingSupported || gDataPagingSupported;
+
+ if (gRomPagingSupported)
+ RDebug::Printf("Rom paging supported");
+ if (gCodePagingSupported)
+ RDebug::Printf("Code paging supported");
+ if (gDataPagingSupported)
+ RDebug::Printf("Data paging supported");
+
+ // Determine the data paging attributes
+ TInt kernelFlags = UserSvr::HalFunction(EHalGroupKernel, EKernelHalConfigFlags, 0, 0);
+ if (kernelFlags < 0)
+ return kernelFlags;
+
+ gDataPagingPolicy = kernelFlags & EKernelConfigDataPagingPolicyMask;
+ if (gDataPagingPolicy == EKernelConfigDataPagingPolicyNoPaging)
+ {
+ RDebug::Printf("Global NO PAGING policy is set");
+ gGlobalNoPaging = ETrue;
+ }
+ if (gDataPagingPolicy == EKernelConfigDataPagingPolicyAlwaysPage)
+ {
+ RDebug::Printf("Global ALWAYS PAGE policy is set");
+ gGlobalAlwaysPage = ETrue;
+ }
+ if (gDataPagingPolicy == EKernelConfigDataPagingPolicyDefaultUnpaged)
+ {
+ RDebug::Printf("Global DEFAULT UNPAGED policy is set");
+ gGlobalDefaultUnpaged = ETrue;
+ }
+ if (gDataPagingPolicy == EKernelConfigDataPagingPolicyDefaultPaged)
+ {
+ RDebug::Printf("Global DEFAULT PAGED policy is set");
+ gGlobalDefaultPage = ETrue;
+ }
+
+ // Determine this process' data paging attribute
+ RProcess process; // Default to point to current process.
+ gProcessPaged = process.DefaultDataPaged();
+ RDebug::Printf(gProcessPaged ? "This process is paged" : "This process is not paged");
+
+ // Get page size
+ TInt r = UserHal::PageSizeInBytes(gPageSize);
+ if (r != KErrNone)
+ return r;
+
+ if (gPagingSupported)
+ {
+ TUint minSize;
+ TUint maxSize;
+ TUint currentSize;
+ r = DPTest::CacheSize(minSize, maxSize, currentSize);
+ if (r != KErrNone)
+ return r;
+
+ gMinCacheSize = minSize / gPageSize;
+ gMaxCacheSize = maxSize / gPageSize;
+ gCurrentCacheSize = currentSize / gPageSize;
+ RDebug::Printf("Cache size (pages): min == %d, max == %d, current == %d",
+ gMinCacheSize, gMaxCacheSize, gCurrentCacheSize);
+ }
+
+ return r;
+ }
+
+//
+// IsDataPagingSupported
+//
+// Determine whether data paging is supported
+//
+TBool IsDataPagingSupported()
+ {
+ return gDataPagingSupported;
+ }
+
+//
+// UpdatePaged
+//
+// Update whether the expected paged status based on the global paging policy.
+//
+void UpdatePaged(TBool& aPaged)
+ {
+ if (gGlobalNoPaging)
+ aPaged = EFalse;
+ if (gGlobalAlwaysPage)
+ aPaged = ETrue;
+ if (!gDataPagingSupported)
+ aPaged = EFalse;
+ }
+
+
+//
+// TestThreadExit
+//
+// Resume the specified thread and verify the exit reason.
+//
+TInt TestThreadExit(RThread& aThread, TExitType aExitType, TInt aExitReason)
+ {
+ // Disable JIT debugging.
+ TBool justInTime=User::JustInTime();
+ User::SetJustInTime(EFalse);
+
+ TRequestStatus status;
+ aThread.Logon(status);
+ aThread.Resume();
+ User::WaitForRequest(status);
+ if (aExitType != aThread.ExitType())
+ return KErrGeneral;
+
+ if (aExitReason != status.Int())
+ return KErrGeneral;
+
+ if (aExitReason != aThread.ExitReason())
+ return KErrGeneral;
+
+
+ if (aExitType == EExitPanic)
+ {
+ if (aThread.ExitCategory()!=_L("USER"))
+ {
+ return KErrGeneral;
+ }
+ }
+
+ CLOSE_AND_WAIT(aThread);
+
+ // Put JIT debugging back to previous status.
+ User::SetJustInTime(justInTime);
+ return KErrNone;
+ }