From: mquinson Date: Thu, 2 Dec 2010 21:48:23 +0000 (+0000) Subject: end of previous commit. Sorry for the noise, I'm doomed to pure svn in that subproject X-Git-Tag: v3_9_90~569^2~19^2~221 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/89f1cc65397f33d62a434e22d4c4a21c6c889f15 end of previous commit. Sorry for the noise, I'm doomed to pure svn in that subproject git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/contrib/trunk/simgrid-java@8933 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/smx_context_java.c b/src/smx_context_java.c new file mode 100644 index 0000000000..781f490cd5 --- /dev/null +++ b/src/smx_context_java.c @@ -0,0 +1,159 @@ +/* context_java - implementation of context switching for java threads */ + +/* Copyright (c) 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + + +#include +#include +#include "smx_context_java.h" + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(jmsg, bindings, "MSG for Java(TM)"); + +static smx_context_t +smx_ctx_java_factory_create_context(xbt_main_func_t code, int argc, + char **argv, + void_pfn_smxprocess_t cleanup_func, + void *data); + +static void smx_ctx_java_free(smx_context_t context); +static void smx_ctx_java_start(smx_context_t context); +static void smx_ctx_java_stop(smx_context_t context); +static void smx_ctx_java_suspend(smx_context_t context); +static void smx_ctx_java_resume(smx_context_t new_context); +static void smx_ctx_java_runall(xbt_swag_t processes); + +void SIMIX_ctx_java_factory_init(smx_context_factory_t * factory) +{ + /* instantiate the context factory */ + smx_ctx_base_factory_init(factory); + + (*factory)->create_context = smx_ctx_java_factory_create_context; + /* Leave default behavior of (*factory)->finalize */ + (*factory)->free = smx_ctx_java_free; + (*factory)->stop = smx_ctx_java_stop; + (*factory)->suspend = smx_ctx_java_suspend; + (*factory)->runall = smx_ctx_java_runall; + (*factory)->name = "ctx_java_factory"; +} + +static smx_context_t +smx_ctx_java_factory_create_context(xbt_main_func_t code, int argc, + char **argv, + void_pfn_smxprocess_t cleanup_func, + void* data) +{ + smx_ctx_java_t context = xbt_new0(s_smx_ctx_java_t, 1); + + /* If the user provided a function for the process then use it + otherwise is the context for maestro */ + if (code) { + context->super.cleanup_func = cleanup_func; + context->jprocess = (jobject) code; + context->jenv = get_current_thread_env(); + jprocess_start(((smx_ctx_java_t) context)->jprocess, + get_current_thread_env()); + }else{ + smx_current_context = (smx_context_t)context; + } + context->super.data = data; + + return (smx_context_t) context; +} + +static void smx_ctx_java_free(smx_context_t context) +{ + if (context) { + smx_ctx_java_t ctx_java = (smx_ctx_java_t) context; + + if (ctx_java->jprocess) { + jobject jprocess = ctx_java->jprocess; + + ctx_java->jprocess = NULL; + + /* if the java process is alive join it */ + if (jprocess_is_alive(jprocess, get_current_thread_env())) + jprocess_join(jprocess, get_current_thread_env()); + } + } + + smx_ctx_base_free(context); +} + +static void smx_ctx_java_stop(smx_context_t context) +{ + jobject jprocess = NULL; + + smx_ctx_java_t ctx_java; + + if (context->cleanup_func) + (*(context->cleanup_func)) (context->data); + + ctx_java = (smx_ctx_java_t) context; + + /*FIXME: is this really necessary? DIRTY HACK: let's comment it and see*/ +// if (((smx_process_t)smx_current_context->data)->iwannadie) { + /* The maestro call xbt_context_stop() with an exit code set to one */ + if (ctx_java->jprocess) { + /* if the java process is alive schedule it */ + if (jprocess_is_alive(ctx_java->jprocess, get_current_thread_env())) { + jprocess_schedule(smx_current_context); + jprocess = ctx_java->jprocess; + ctx_java->jprocess = NULL; + + /* interrupt the java process */ + jprocess_exit(jprocess, get_current_thread_env()); + } + } +// } else { + /* the java process exits */ +// jprocess = ctx_java->jprocess; +// ctx_java->jprocess = NULL; +// } + + /* delete the global reference associated with the java process */ + jprocess_delete_global_ref(jprocess, get_current_thread_env()); +} + +/*static void smx_ctx_java_swap(smx_context_t context) +{ + if (context) { + smx_context_t self = current_context; + + current_context = context; + + jprocess_schedule(context); + + current_context = self; + } + + if (current_context->iwannadie) + smx_ctx_java_stop(1); +}*/ + +static void smx_ctx_java_suspend(smx_context_t context) +{ + jprocess_unschedule(context); +} + +// FIXME: inline those functions +static void smx_ctx_java_resume(smx_context_t new_context) +{ + jprocess_schedule(new_context); +} + +static void smx_ctx_java_runall(xbt_swag_t processes) +{ + smx_process_t process; + smx_context_t old_context; + + while ((process = xbt_swag_extract(processes))) { + old_context = smx_current_context; + smx_current_context = SIMIX_process_get_context(process); + smx_ctx_java_resume(smx_current_context); + smx_current_context = old_context; + } +} diff --git a/src/smx_context_java.h b/src/smx_context_java.h new file mode 100644 index 0000000000..d801dc3c57 --- /dev/null +++ b/src/smx_context_java.h @@ -0,0 +1,27 @@ +/* Copyright (c) 2009, 2010. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#ifndef _XBT_CONTEXT_JAVA_H +#define _XBT_CONTEXT_JAVA_H + +#include +#include +#include "jmsg.h" +#include "jmsg_process.h" + +SG_BEGIN_DECL() + +typedef struct s_smx_ctx_java { + s_smx_ctx_base_t super; /* Fields of super implementation */ + jobject jprocess; /* the java process instance binded with the msg process structure */ + JNIEnv *jenv; /* jni interface pointer associated to this thread */ +} s_smx_ctx_java_t, *smx_ctx_java_t; + +void SIMIX_ctx_java_factory_init(smx_context_factory_t *factory); + +SG_END_DECL() + +#endif /* !_XBT_CONTEXT_JAVA_H */