diff -r bbf46f59e123 -r 25ffed67c7ef graphicscomposition/openwfsupport/inc/owftestexithelper.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicscomposition/openwfsupport/inc/owftestexithelper.inl Wed Sep 01 12:39:21 2010 +0100 @@ -0,0 +1,135 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// A copy of shutdown cleanup functions that should be called +// to properly support openWF. +// These methods are implemented and called from Window Server - WServ, CWsTop +// but this copy can be called by any low-level unit tests that bypass WServ +// but need to provide the same clean-up behaviour. +// @test +// @internalTechnology +// +// Currently, three things are cleaned up: +// 1) Singleton API mutex in OpenWF implementation +// 2) Singleton Find/Acquire mutext in Native Stream implementation +// 3) EGL thread status +// +// Note that while these cleanups are only required by OWF-C implementations, +// the methods called should be harmless if called +// when some other composition solution is in action. +#include +#include + +// IDs of p&s properties that optionally contain onexit callbacks +// that may be used to release singletons owned by libraries at shutdown in order to make +// the memory leak tests work. +// By convention, the ID is the same as the UID3 of the libary. +static TBool gReleaseSingletonsOnExit = EFalse; +static const TUid KOpenWfcImplCleanupKey = {0x10286FC4}; +static const TUid KOpenWfcInteropCleanupKey = {0x10286FC5}; + + +static void DefineOwfSingletonKey(const TUid& aSingletonKey) +/** + * Defines a new property for a singleton key. WServ must only process + * singleton keys that it created to prevent a malicious process with the + * WriteDeviceData capability causing arbitrary functions to be executed. + * + * @param aSingeltonKey The UID of the singleton key to define. + */ + { + RThread t; + TUid category = { t.SecureId().iId }; + RProperty prop; + + // Write access is restricted to THIS process + TInt err = prop.Define( category, aSingletonKey.iUid, + RProperty::EByteArray, TSecurityPolicy( t.SecureId() ), + TSecurityPolicy( t.SecureId() ), sizeof( TCallBack ) ); + + if ( err == KErrNone || err == KErrAlreadyExists) + { + TCallBack cb( NULL, NULL ); + TPckgC cbPckg( cb ); + + // Any error should cause the properties to be ignored + err = prop.Set( category, aSingletonKey.iUid, cbPckg ); + } + //We presume that if property already exists it was previously set by this test code. + if ( err != KErrNone ) + { + // A problem occured / the property already existed so for safety + // the release code should be skipped. + gReleaseSingletonsOnExit = EFalse; + } + + prop.Close(); + t.Close(); + } +#define DefineOwfSingletonKeys DefineOwfSingletonKeys +/** Call this method before starting the compositor. + * + */ +static void DefineOwfSingletonKeys() + { + // Define properties for singleton callbacks. This must only be done ONCE + // to ensure the properties can't be hijacked. + gReleaseSingletonsOnExit = ETrue; + DefineOwfSingletonKey(KOpenWfcInteropCleanupKey); + DefineOwfSingletonKey(KOpenWfcImplCleanupKey); + } + +static void DeleteOwfSingleton( const TUid& aSingletonKey ) +/** + * Deletes a singleton object that was created on WServ's main heap. + * + * @pre The ws plugins have not been unloaded. + * @param aSingletonKey The UID of the singleton which correponds to an + * RProperty within WServ's category. + */ + { + if ( gReleaseSingletonsOnExit ) + { + RThread t; + TPckgBuf cb; + RProperty prop; + TInt err = prop.Get(TUid::Uid(t.SecureId().iId), aSingletonKey.iUid, cb); + if (err == KErrNone && cb.Length() == sizeof(TCallBack) && + cb().iFunction && cb().iPtr == &User::Heap()) + { + // Callback is only invoked if the heap for the singleton was the + // WServ heap because the WServ memory leak tests only check this + // heap. + cb().CallBack(); + } + // Errors are ignored because the purpose of this function is to free + // singletons in order top make memory leak checks pass. + prop.Close(); + t.Close(); + } + } +/** Call this method to destroy OWF-C singletons on shut down + * + */ +#define DeleteOwfSingletons DeleteOwfSingletons +static void DeleteOwfSingletons() + { + // Free singletons on WServ heap created by libraries. Must be called + // BEFORE iPluginManager is deleted otherwise the library code could have + // been unloaded. + DeleteOwfSingleton(KOpenWfcImplCleanupKey); + DeleteOwfSingleton(KOpenWfcInteropCleanupKey); + /* Release any use of EGL by this thread. */ + eglReleaseThread(); + } +