this->jenv_ = env;
}
-void JavaContext::stop()
+void JavaContext::stop_hook()
{
JNIEnv* env = this->jenv_;
env->DeleteGlobalRef(this->jprocess_);
// XBT_ERROR("Cannot detach the current thread");
// simgrid::xbt::Backtrace().display();
}
- ThreadContext::stop();
}
}}} // namespace simgrid::kernel::context
smx_actor_t process);
void start_hook() override;
- void stop() override;
+ void stop_hook() override;
};
class JavaContextFactory : public simgrid::kernel::context::ContextFactory {
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)
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.");
void ThreadContext::stop()
{
Context::stop();
+ stop_hook();
throw StopRequest();
}
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);
};