ncdengine/engine/src/catalogsundertaker.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/engine/src/catalogsundertaker.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,129 @@
+/*
+* Copyright (c) 2006 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:   Implementation of CCatalogsClientServerServer
+*
+*/
+
+
+#include "catalogsserverdefines.h"
+#include "catalogsdebug.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+_LIT( KExitTypeKill, "Kill" );
+_LIT( KExitTypeTerminate, "Terminate" );
+_LIT( KExitTypePanic, "Panic" );
+_LIT( KExitTypeUnknown, "Unknown" );
+
+static TInt CatalogsUndertaker()
+    {
+    DLTRACEIN((""));
+
+    TFullName catalogsThreadName;
+    TInt err = User::GetDesParameter( 15, catalogsThreadName );
+    
+    if( err != KErrNone )
+        {
+        DLERROR(( "Failed to read parameter slot 15, error %d", err ));
+        catalogsThreadName = KNullDesC();
+        }
+    else
+        {
+        DLINFO(( _L("Read catalogs thread name: %S"), &catalogsThreadName ));
+        }
+
+    RUndertaker undertaker;
+    TRequestStatus status;
+    TInt deadThreadHandleNumber;
+
+    undertaker.Create();
+
+    for( ;; )
+        {
+        undertaker.Logon( status, deadThreadHandleNumber );
+        User::WaitForRequest( status );
+
+        RThread deadThread;
+        deadThread.SetHandle( deadThreadHandleNumber );
+
+        const TDesC* type;
+
+        switch( deadThread.ExitType() )
+            {
+            case EExitKill:
+                type = &KExitTypeKill;
+                break;
+
+            case EExitTerminate:
+                type = &KExitTypeTerminate;
+                break;
+
+            case EExitPanic:
+                type = &KExitTypePanic;
+                break;
+
+            default:
+                type = &KExitTypeUnknown;
+                DLERROR(( "Exit type: %d", (TInt)deadThread.ExitType() ));
+                break;
+            }
+
+
+        DLWARNING(( _L("THREAD %S DEATH observed! %S %S %d"), 
+            &deadThread.FullName(),
+            type,
+            &deadThread.ExitCategory(),
+            deadThread.ExitReason() ));
+        
+        type = type; // to suppress compiler warning
+
+        if( catalogsThreadName == deadThread.FullName() )
+            {
+            DLERROR(( "Catalogs server thread killed, undertaker exits" ));
+            deadThread.Close();
+            break;
+            }
+
+        deadThread.Close();
+
+        }
+
+    undertaker.Close();
+    DLTRACEOUT(("KErrNone"));
+
+    return KErrNone;
+    }
+
+/**
+ * Platform dependant entry points
+ */
+
+IMPORT_C TInt WinsMain();
+EXPORT_C TInt WinsMain()
+	{
+	// WINS DLL entry-point. Just return the real thread function 
+    // cast to TInt
+	return reinterpret_cast<TInt>( 
+	    CatalogsUndertaker );
+	}
+
+GLDEF_C TInt E32Main()
+    {
+    CTrapCleanup* cleanupStack = CTrapCleanup::New();
+    DLINIT;
+    TInt result = CatalogsUndertaker();
+    DLUNINIT;
+    delete cleanupStack;
+    return result;
+    }