From 821649e2221068a113b41b8e9c5ac4ba76887772 Mon Sep 17 00:00:00 2001 From: mquinson Date: Mon, 17 Aug 2009 09:24:47 +0000 Subject: [PATCH] Fixed the java's context interface to build with the context module layout [Cristian] git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6564 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/include/simix/datatypes.h | 1 + src/java/jmsg.c | 10 +- src/java/jmsg_process.c | 10 +- src/java/jmsg_process.h | 6 +- src/simix/private.h | 4 +- src/simix/smx_context_java.c | 178 ++++++++++++---------------------- src/simix/smx_context_java.h | 8 +- src/simix/smx_process.c | 1 - 8 files changed, 82 insertions(+), 136 deletions(-) diff --git a/src/include/simix/datatypes.h b/src/include/simix/datatypes.h index 859727ea95..0ac220284c 100644 --- a/src/include/simix/datatypes.h +++ b/src/include/simix/datatypes.h @@ -50,5 +50,6 @@ SG_BEGIN_DECL() typedef struct s_smx_process *smx_process_t; /** @} */ + typedef struct s_smx_context *smx_context_t; SG_END_DECL() #endif diff --git a/src/java/jmsg.c b/src/java/jmsg.c index f16f2c7b02..0fa342b5a8 100644 --- a/src/java/jmsg.c +++ b/src/java/jmsg.c @@ -12,7 +12,7 @@ #include "msg/msg.h" #include "msg/private.h" #include "simix/private.h" -#include "xbt/xbt_context_java.h" +#include "simix/smx_context_java.h" #include "jmsg_process.h" #include "jmsg_host.h" @@ -51,8 +51,8 @@ JNIEnv *get_current_thread_env(void) static jobject native_to_java_process(m_process_t process) { - return ((xbt_ctx_java_t) - (process->simdata->s_process->simdata->context))->jprocess; + return ((smx_ctx_java_t) + (process->simdata->s_process->context))->jprocess; } @@ -1021,7 +1021,7 @@ Java_simgrid_msg_MsgNative_processExit(JNIEnv * env, jclass cls, return; } - xbt_context_stop(0); + SIMIX_context_stop(0); } JNIEXPORT void JNICALL @@ -1097,7 +1097,7 @@ Java_simgrid_msg_MsgNative_selectContextFactory(JNIEnv * env, jclass class, const char *name = (*env)->GetStringUTFChars(env, jname, 0); TRY { - xbt_context_select_factory(name); + SIMIX_context_select_factory(name); } CATCH(e) { errmsg = xbt_strdup(e.msg); xbt_ex_free(e); diff --git a/src/java/jmsg_process.c b/src/java/jmsg_process.c index 60c346415f..4c774e8bea 100644 --- a/src/java/jmsg_process.c +++ b/src/java/jmsg_process.c @@ -14,7 +14,7 @@ #include "jmsg.h" #include "jxbt_utilities.h" -#include "xbt/xbt_context_java.h" +#include "simix/smx_context_java.h" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg); @@ -184,7 +184,7 @@ jboolean jprocess_is_valid(jobject jprocess, JNIEnv * env) return (*env)->GetLongField(env, jprocess, id) ? JNI_TRUE : JNI_FALSE; } -void jprocess_schedule(xbt_context_t context) +void jprocess_schedule(smx_context_t context) { JNIEnv *env; jmethodID id; @@ -196,12 +196,12 @@ void jprocess_schedule(xbt_context_t context) if (!id) return; - (*env)->CallVoidMethod(env, ((xbt_ctx_java_t) context)->jprocess, id); + (*env)->CallVoidMethod(env, ((smx_ctx_java_t) context)->jprocess, id); } -void jprocess_unschedule(xbt_context_t context) +void jprocess_unschedule(smx_context_t context) { JNIEnv *env; jmethodID id; @@ -214,5 +214,5 @@ void jprocess_unschedule(xbt_context_t context) if (!id) return; - (*env)->CallVoidMethod(env, ((xbt_ctx_java_t) context)->jprocess, id); + (*env)->CallVoidMethod(env, ((smx_ctx_java_t) context)->jprocess, id); } diff --git a/src/java/jmsg_process.h b/src/java/jmsg_process.h index fda48a0ed8..5056c45916 100644 --- a/src/java/jmsg_process.h +++ b/src/java/jmsg_process.h @@ -15,7 +15,7 @@ #include #include "msg/msg.h" -#include "xbt/context.h" +#include "simix/simix.h" /** * This function returns a global reference to the java process instance @@ -238,9 +238,9 @@ void jprocess_signal_cond(jobject jprocess, JNIEnv * env); */ void jprocess_wait_cond(jobject jprocess, JNIEnv * env); -void jprocess_schedule(xbt_context_t context); +void jprocess_schedule(smx_context_t context); -void jprocess_unschedule(xbt_context_t context); +void jprocess_unschedule(smx_context_t context); #endif /* !MSG_JPROCESS_H */ diff --git a/src/simix/private.h b/src/simix/private.h index da4b964b5a..4fd9db7783 100644 --- a/src/simix/private.h +++ b/src/simix/private.h @@ -54,9 +54,7 @@ extern SIMIX_Global_t simix_global; /******************************** Process *************************************/ -typedef struct s_smx_context *smx_context_t; - -/** @brief Process datatype +/** @brief Process datatype @ingroup m_datatypes_management_details @{ */ typedef struct s_smx_process { s_xbt_swag_hookup_t process_hookup; diff --git a/src/simix/smx_context_java.c b/src/simix/smx_context_java.c index b40d5e5060..ed5758bdbc 100644 --- a/src/simix/smx_context_java.c +++ b/src/simix/smx_context_java.c @@ -10,8 +10,8 @@ #include "xbt/function_types.h" #include "xbt/ex_interface.h" -#include "xbt/xbt_context_private.h" -#include "xbt/xbt_context_java.h" +#include "private.h" +#include "smx_context_java.h" XBT_LOG_NEW_DEFAULT_CATEGORY(jmsg, "MSG for Java(TM)"); @@ -21,45 +21,30 @@ static ex_ctx_t *xbt_ctx_java_ex_ctx(void); /* callback: termination */ static void xbt_ctx_java_ex_terminate(xbt_ex_t * e); -static xbt_context_t -xbt_ctx_java_factory_create_context(const char *name, xbt_main_func_t code, - void_f_pvoid_t startup_func, - void *startup_arg, - void_f_pvoid_t cleanup_func, - void *cleanup_arg, int argc, char **argv); +static smx_context_t +smx_ctx_java_factory_create_context(xbt_main_func_t code, int argc, char** argv, + void_f_pvoid_t cleanup_func, void* cleanup_arg); -static int -xbt_ctx_java_factory_create_maestro_context(xbt_context_t * maestro); +static smx_context_t smx_ctx_java_factory_create_maestro_context(void); -static int xbt_ctx_java_factory_finalize(xbt_context_factory_t * factory); +static int smx_ctx_java_factory_finalize(smx_context_factory_t * factory); -static void xbt_ctx_java_free(xbt_context_t context); +static void smx_ctx_java_free(smx_context_t context); -static void xbt_ctx_java_kill(xbt_context_t context); +static void smx_ctx_java_start(smx_context_t context); -static void xbt_ctx_java_schedule(xbt_context_t context); +static void smx_ctx_java_stop(smx_context_t context); -static void xbt_ctx_java_yield(void); +static void smx_ctx_java_suspend(smx_context_t context); -static void xbt_ctx_java_start(xbt_context_t context); - -static void xbt_ctx_java_stop(int exit_code); - -static void xbt_ctx_java_swap(xbt_context_t context); - -static void xbt_ctx_java_schedule(xbt_context_t context); - -static void xbt_ctx_java_yield(void); - -static void xbt_ctx_java_suspend(xbt_context_t context); - -static void xbt_ctx_java_resume(xbt_context_t context); +static void + smx_ctx_java_resume(smx_context_t old_context, smx_context_t new_context); /* callback: context fetching */ static ex_ctx_t *xbt_ctx_java_ex_ctx(void) { - return current_context->exception; + return simix_global->current_process->context->exception; } /* callback: termination */ @@ -69,75 +54,66 @@ static void xbt_ctx_java_ex_terminate(xbt_ex_t * e) abort(); } -void xbt_ctx_java_factory_init(xbt_context_factory_t * factory) +void SIMIX_ctx_java_factory_init(smx_context_factory_t * factory) { /* context exception handlers */ __xbt_ex_ctx = xbt_ctx_java_ex_ctx; __xbt_ex_terminate = xbt_ctx_java_ex_terminate; /* instantiate the context factory */ - *factory = xbt_new0(s_xbt_context_factory_t, 1); - - (*factory)->create_context = xbt_ctx_java_factory_create_context; - (*factory)->finalize = xbt_ctx_java_factory_finalize; - (*factory)->create_maestro_context = xbt_ctx_java_factory_create_maestro_context; - (*factory)->free = xbt_ctx_java_free; - (*factory)->kill = xbt_ctx_java_kill; - (*factory)->schedule = xbt_ctx_java_schedule; - (*factory)->yield = xbt_ctx_java_yield; - (*factory)->start = xbt_ctx_java_start; - (*factory)->stop = xbt_ctx_java_stop; + *factory = xbt_new0(s_smx_context_factory_t, 1); + + (*factory)->create_context = smx_ctx_java_factory_create_context; + (*factory)->finalize = smx_ctx_java_factory_finalize; + (*factory)->create_maestro_context = smx_ctx_java_factory_create_maestro_context; + (*factory)->free = smx_ctx_java_free; + (*factory)->start = smx_ctx_java_start; + (*factory)->stop = smx_ctx_java_stop; + (*factory)->suspend = smx_ctx_java_suspend; + (*factory)->resume = smx_ctx_java_resume; + (*factory)->name = "ctx_java_factory"; } -static int -xbt_ctx_java_factory_create_maestro_context(xbt_context_t * maestro) +static smx_context_t smx_ctx_java_factory_create_maestro_context(void) { - xbt_ctx_java_t context = xbt_new0(s_xbt_ctx_java_t, 1); + smx_ctx_java_t context = xbt_new0(s_smx_ctx_java_t, 1); context->exception = xbt_new(ex_ctx_t, 1); XBT_CTX_INITIALIZE(context->exception); - *maestro = (xbt_context_t) context; - - return 0; + return (smx_context_t) context; } -static int xbt_ctx_java_factory_finalize(xbt_context_factory_t * factory) +static int smx_ctx_java_factory_finalize(smx_context_factory_t * factory) { - free(maestro_context->exception); + /*FIXME: free(maestro_context->exception);*/ free(*factory); *factory = NULL; return 0; } -static xbt_context_t -xbt_ctx_java_factory_create_context(const char *name, xbt_main_func_t code, - void_f_pvoid_t startup_func, - void *startup_arg, - void_f_pvoid_t cleanup_func, - void *cleanup_arg, int argc, char **argv) +static smx_context_t +smx_ctx_java_factory_create_context(xbt_main_func_t code, int argc, char** argv, + void_f_pvoid_t cleanup_func, void* cleanup_arg) { - xbt_ctx_java_t context = xbt_new0(s_xbt_ctx_java_t, 1); + smx_ctx_java_t context = xbt_new0(s_smx_ctx_java_t, 1); - context->name = xbt_strdup(name); context->cleanup_func = cleanup_func; context->cleanup_arg = cleanup_arg; context->exception = xbt_new(ex_ctx_t, 1); XBT_CTX_INITIALIZE(context->exception); - context->jprocess = (jobject) startup_arg; + context->jprocess = (jobject) code; context->jenv = get_current_thread_env(); - return (xbt_context_t) context; + return (smx_context_t) context; } -static void xbt_ctx_java_free(xbt_context_t context) +static void smx_ctx_java_free(smx_context_t context) { if (context) { - xbt_ctx_java_t ctx_java = (xbt_ctx_java_t) context; - - free(ctx_java->name); + smx_ctx_java_t ctx_java = (smx_ctx_java_t) context; if (ctx_java->jprocess) { jobject jprocess = ctx_java->jprocess; @@ -157,69 +133,30 @@ static void xbt_ctx_java_free(xbt_context_t context) } } -static void xbt_ctx_java_kill(xbt_context_t context) +static void smx_ctx_java_start(smx_context_t context) { - context->iwannadie = 1; - xbt_ctx_java_swap(context); -} - -/** - * \param context the winner - * - * Calling this function blocks the current context and schedule \a context. - * When \a context will call xbt_context_yield, it will return - * to this function as if nothing had happened. - * - * Only the maestro can call this function to run a given process. - */ -static void xbt_ctx_java_schedule(xbt_context_t context) -{ - xbt_assert0((current_context == maestro_context), - "You are not supposed to run this function here!"); - xbt_ctx_java_swap(context); -} - -/** - * Calling this function makes the current context yield. The context - * that scheduled it returns from xbt_context_schedule as if nothing - * had happened. - * - * Only the processes can call this function, giving back the control - * to the maestro - */ -static void xbt_ctx_java_yield(void) -{ - xbt_assert0((current_context != maestro_context), - "You are not supposed to run this function here!"); - jprocess_unschedule(current_context); -} - -static void xbt_ctx_java_start(xbt_context_t context) -{ - jprocess_start(((xbt_ctx_java_t) context)->jprocess, + jprocess_start(((smx_ctx_java_t) context)->jprocess, get_current_thread_env()); } -static void xbt_ctx_java_stop(int exit_code) +static void smx_ctx_java_stop(smx_context_t context) { jobject jprocess = NULL; - xbt_ctx_java_t ctx_java; - - if (current_context->cleanup_func) - (*(current_context->cleanup_func)) (current_context->cleanup_arg); + smx_ctx_java_t ctx_java; - xbt_swag_remove(current_context, context_living); - xbt_swag_insert(current_context, context_to_destroy); + if (context->cleanup_func) + (*(context->cleanup_func)) (context->cleanup_arg); - ctx_java = (xbt_ctx_java_t) current_context; + ctx_java = (smx_ctx_java_t) context; - if (ctx_java->iwannadie) { + /*FIXME: is this really necessary?*/ + if (simix_global->current_process->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(current_context); + jprocess_schedule(simix_global->current_process->context); jprocess = ctx_java->jprocess; ctx_java->jprocess = NULL; @@ -238,10 +175,10 @@ static void xbt_ctx_java_stop(int exit_code) jprocess_delete_global_ref(jprocess, get_current_thread_env()); } -static void xbt_ctx_java_swap(xbt_context_t context) +/*static void smx_ctx_java_swap(smx_context_t context) { if (context) { - xbt_context_t self = current_context; + smx_context_t self = current_context; current_context = context; @@ -251,5 +188,16 @@ static void xbt_ctx_java_swap(xbt_context_t context) } if (current_context->iwannadie) - xbt_ctx_java_stop(1); + smx_ctx_java_stop(1); +}*/ + +static void smx_ctx_java_suspend(smx_context_t context) +{ + jprocess_unschedule(context); } + +static void +smx_ctx_java_resume(smx_context_t old_context, smx_context_t new_context) +{ + jprocess_schedule(new_context); +} \ No newline at end of file diff --git a/src/simix/smx_context_java.h b/src/simix/smx_context_java.h index 7c7531549f..f646036108 100644 --- a/src/simix/smx_context_java.h +++ b/src/simix/smx_context_java.h @@ -4,17 +4,17 @@ #include "portable.h" #include "xbt/misc.h" -#include "xbt/xbt_context_private.h" +#include "private.h" #include "java/jmsg.h" #include "java/jmsg_process.h" SG_BEGIN_DECL() - typedef struct s_xbt_ctx_java { - XBT_CTX_BASE_T; + typedef struct s_smx_ctx_java { + SMX_CTX_BASE_T; jobject jprocess; /* the java process instance binded with the msg process structure */ JNIEnv *jenv; /* jni interface pointer associated to this thread */ - } s_xbt_ctx_java_t, *xbt_ctx_java_t; + } s_smx_ctx_java_t, *smx_ctx_java_t; SG_END_DECL() #endif /* !_XBT_CONTEXT_JAVA_H */ diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index e0c849ca70..728cb372da 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -14,7 +14,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_process, simix, "Logging specific to SIMIX (process)"); -/******************************** Process ************************************/ /** * \brief Move a process to the list of process to destroy. * */ -- 2.20.1