Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Improve process termination in Java world.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 23 Jan 2019 11:29:45 +0000 (12:29 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Wed, 23 Jan 2019 11:29:45 +0000 (12:29 +0100)
src/bindings/java/JavaContext.cpp
src/bindings/java/JavaContext.hpp
src/bindings/java/jmsg.cpp
src/kernel/context/ContextThread.cpp
src/kernel/context/ContextThread.hpp

index f65f7e6..7adaaaa 100644 (file)
@@ -62,7 +62,7 @@ void JavaContext::start_hook()
   this->jenv_ = env;
 }
 
-void JavaContext::stop()
+void JavaContext::stop_hook()
 {
     JNIEnv* env = this->jenv_;
     env->DeleteGlobalRef(this->jprocess_);
@@ -78,7 +78,6 @@ void JavaContext::stop()
       // XBT_ERROR("Cannot detach the current thread");
       // simgrid::xbt::Backtrace().display();
     }
-    ThreadContext::stop();
 }
 
 }}} // namespace simgrid::kernel::context
index 108b2f2..f1e0570 100644 (file)
@@ -37,7 +37,7 @@ public:
           smx_actor_t process);
 
   void start_hook() override;
-  void stop() override;
+  void stop_hook() override;
 };
 
 class JavaContextFactory : public simgrid::kernel::context::ContextFactory {
index 1af0c84..5e24128 100644 (file)
@@ -148,18 +148,11 @@ JNIEXPORT void JNICALL JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass
   for (auto const& elm : java_storage_map)
     jstorage_unref(env, elm.second);
 
-  // Don't even report the surviving threads, just to pass the tests...
-  exit(0);
-
   /* Display the status of remaining threads. None should survive, but who knows */
   jclass clsProcess = jxbt_get_class(env, "org/simgrid/msg/Process");
   jmethodID idDebug = jxbt_get_static_jmethod(env, clsProcess, "debugAllThreads", "()V");
   xbt_assert(idDebug != nullptr, "Method Process.debugAllThreads() not found...");
   env->CallStaticVoidMethod(clsProcess, idDebug);
-
-  /* FIXME: don't be of such an EXTREM BRUTALITY to stop the jvm.
-   * Sorry I don't get it working otherwise: some thread survive their own end, and I fail to do anything better */
-  exit(0);
 }
 
 JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls, jstring jplatformFile)
index cc2529a..171e32e 100644 (file)
@@ -100,8 +100,10 @@ void *ThreadContext::wrapper(void *param)
 
   try {
     (*context)();
-    if (not context->is_maestro()) // Just in case somebody detached maestro
+    if (not context->is_maestro()) // Just in case somebody detached maestro
       context->Context::stop();
+      context->stop_hook();
+    }
   } catch (StopRequest const&) {
     XBT_DEBUG("Caught a StopRequest in Thread::wrapper");
     xbt_assert(not context->is_maestro(), "Maestro shall not receive StopRequests, even when detached.");
@@ -146,6 +148,7 @@ void ThreadContext::yield()
 void ThreadContext::stop()
 {
   Context::stop();
+  stop_hook();
   throw StopRequest();
 }
 
index 623aec4..09ac695 100644 (file)
@@ -44,6 +44,7 @@ private:
   void yield();                // match a call to yield()
   virtual void start_hook() { /* empty placeholder, called after start(). Used in parallel mode and Java */}
   virtual void yield_hook() { /* empty placeholder, called before yield(). Used in parallel mode */}
+  virtual void stop_hook() { /* empty placeholder, called at stop(). Used in Java */}
 
   static void* wrapper(void *param);
 };