javaruntimes/midp/runtimestarter/src/midpruntimestarter.cpp
branchRCL_3
changeset 17 0fd27995241b
parent 14 04becd199f91
child 18 9ac0a0a7da70
--- a/javaruntimes/midp/runtimestarter/src/midpruntimestarter.cpp	Fri Apr 30 10:40:48 2010 +0300
+++ b/javaruntimes/midp/runtimestarter/src/midpruntimestarter.cpp	Tue May 11 16:07:20 2010 +0300
@@ -23,6 +23,10 @@
 #include <fstream>
 #include <unistd.h>
 
+#ifndef __SYMBIAN32__
+#include <signal.h>
+#endif // __SYMBIAN32__
+
 #include "midpruntimestarter.h"
 #include "applicationinfosetter.h"
 #include "runtimeexception.h"
@@ -59,7 +63,7 @@
 
 
 MidpRuntimeStarter::MidpRuntimeStarter(): mMidletInfo(new MidletInfo()), // codescanner::nonleavenew
-        mRuntimeState(Constructed)
+        mRuntimeState(Constructed), mShudownOk(false)
 {
     JELOG2(EJavaRuntime);
 }
@@ -236,6 +240,14 @@
     }
     CoreUi::releaseUi(coreUiLoader);
 
+    // Close the thread that ensures the exit.
+    if (mExitMonitor.get())
+    {
+        mShudownOk = true;
+        LOG(EJavaRuntime, EInfo, "Notifying exit thread.");
+        mExitMonitor->notify();
+    }
+
     return status;
 }
 
@@ -489,14 +501,47 @@
     }
 
 }
+
+void* MidpRuntimeStarter::ensureExit(void* ptr)
+{
+    JELOG2(EUtils);
+#ifdef __SYMBIAN32__
+    RThread().SetPriority(EPriorityMore);
+#endif // __SYMBIAN32__
+    MidpRuntimeStarter* starter = reinterpret_cast<MidpRuntimeStarter*>(ptr);
+    LOG(EJavaRuntime, EInfo, "Starting to wait for the shutdown.");
+    const int waitTime = 1000; // 1 second.
+    starter->mExitMonitor->wait(waitTime);
+    LOG(EJavaRuntime, EInfo, "woke up from monitor.");
+    if (!starter->mShudownOk)
+    {
+        LOG(EJavaRuntime, EInfo, "Killing process.");
+#ifdef __SYMBIAN32__
+        RProcess().Kill(0);
+#else
+        kill(getpid(), SIGTERM);
+#endif // __SYMBIAN32__
+    }
+    LOG(EJavaRuntime, EInfo, "Clean exit.");
+    return 0;
+}
+
 void MidpRuntimeStarter::closeRuntimeInd()
 {
     JELOG2(EJavaRuntime);
     LOG(EJavaRuntime, EInfo, "Starter got close indication from JVM");
+
+    // Create a thread for ensure the exit of the process, if something goes
+    // wrong.
+    pthread_t tid;
+    mExitMonitor.reset(Monitor::createMonitor());
+    pthread_create(&tid, 0, ensureExit, this);
+
     if (mMidletInfo->mPushStart)
     {
         closePush();
     }
+
 }
 
 void MidpRuntimeStarter::setUids(const Uid& midletUid, const Uid& midletSuiteUid)