graphicscomposition/openwfsupport/inc/owftestexithelper.inl
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfsupport/inc/owftestexithelper.inl	Tue Feb 02 01:47:50 2010 +0200
@@ -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 <e32property.h>
+#include <EGL/egl.h>
+
+// 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<TCallBack> 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<TCallBack> 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();
+    }
+