X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b2fe69328dc3b66ce74894b58f5446514e48d53c..15311a88748c43e1cce725bbfca20ea95e9debea:/src/bindings/java/JavaContext.cpp diff --git a/src/bindings/java/JavaContext.cpp b/src/bindings/java/JavaContext.cpp index 37c96d7225..7796bda171 100644 --- a/src/bindings/java/JavaContext.cpp +++ b/src/bindings/java/JavaContext.cpp @@ -56,28 +56,12 @@ JavaContext::JavaContext(std::function code, smx_actor_t process) : Context(std::move(code), cleanup_func, process) { - static int thread_amount=0; - thread_amount++; - - /* If the user provided a function for the process then use it otherwise is the context for maestro */ + /* If the user provided a function for the process then use it. Otherwise is the context for maestro */ if (has_code()) { - this->begin = xbt_os_sem_init(0); - this->end = xbt_os_sem_init(0); - - try { - this->thread = xbt_os_thread_create( - nullptr, JavaContext::wrapper, this, nullptr); - } - catch (xbt_ex& ex) { - char* str = bprintf( - "Failed to create context #%d. You may want to switch to Java coroutines to increase your limits (error: %s)." - "See the Install section of simgrid-java documentation (in doc/install.html) for more on coroutines.", - thread_amount, ex.what()); - xbt_ex new_exception(XBT_THROW_POINT, str); - new_exception.category = ex.category; - new_exception.value = ex.value; - std::throw_with_nested(std::move(new_exception)); - } + this->begin_ = xbt_os_sem_init(0); + this->end_ = xbt_os_sem_init(0); + + this->thread_ = xbt_os_thread_create(nullptr, JavaContext::wrapper, this, nullptr); } else { xbt_os_thread_set_extra_data(this); } @@ -85,11 +69,11 @@ JavaContext::JavaContext(std::function code, JavaContext::~JavaContext() { - if (this->thread) { + if (this->thread_) { // We are not in maestro context - xbt_os_thread_join(this->thread, nullptr); - xbt_os_sem_destroy(this->begin); - xbt_os_sem_destroy(this->end); + xbt_os_thread_join(this->thread_, nullptr); + xbt_os_sem_destroy(this->begin_); + xbt_os_sem_destroy(this->end_); } } @@ -102,9 +86,9 @@ void* JavaContext::wrapper(void *data) JNIEnv *env; XBT_ATTRIB_UNUSED jint error = __java_vm->AttachCurrentThread((void**)&env, nullptr); xbt_assert((error == JNI_OK), "The thread could not be attached to the JVM"); - context->jenv = env; + context->jenv_ = env; //Wait for the first scheduling round to happen. - xbt_os_sem_acquire(context->begin); + xbt_os_sem_acquire(context->begin_); //Create the "Process" object if needed. (*context)(); context->stop(); @@ -155,26 +139,26 @@ void JavaContext::stop() } else { Context::stop(); /* detach the thread and kills it */ - JNIEnv *env = this->jenv; - env->DeleteGlobalRef(this->jprocess); + JNIEnv* env = this->jenv_; + env->DeleteGlobalRef(this->jprocess_); XBT_ATTRIB_UNUSED jint error = __java_vm->DetachCurrentThread(); xbt_assert((error == JNI_OK), "The thread couldn't be detached."); - xbt_os_sem_release(this->end); + xbt_os_sem_release(this->end_); xbt_os_thread_exit(nullptr); } } void JavaContext::suspend() { - xbt_os_sem_release(this->end); - xbt_os_sem_acquire(this->begin); + xbt_os_sem_release(this->end_); + xbt_os_sem_acquire(this->begin_); } // FIXME: inline those functions void JavaContext::resume() { - xbt_os_sem_release(this->begin); - xbt_os_sem_acquire(this->end); + xbt_os_sem_release(this->begin_); + xbt_os_sem_acquire(this->end_); } }}} // namespace simgrid::kernel::context