3 #include "xbt/function_types.h"
\r
4 #include "xbt/ex_interface.h"
\r
6 XBT_LOG_NEW_DEFAULT_CATEGORY(jmsg,"MSG for Java(TM)");
\r
8 #include "java/jmsg.c"
\r
9 #include "java/jmsg_channel.c"
\r
10 #include "java/jmsg_host.c"
\r
11 #include "java/jmsg_parallel_task.c"
\r
12 #include "java/jmsg_task.c"
\r
13 #include "java/jxbt_utilities.c"
\r
14 #include "java/jmsg_process.c"
\r
17 /* callback: context fetching */
\r
19 xbt_jcontext_ex_ctx(void);
\r
21 /* callback: termination */
\r
23 xbt_jcontext_ex_terminate(xbt_ex_t *e);
\r
25 static xbt_context_t
\r
26 xbt_jcontext_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);
\r
29 xbt_jcontext_factory_create_maestro_context(xbt_context_t* maestro);
\r
32 xbt_jcontext_factory_finalize(xbt_context_factory_t* factory);
\r
35 xbt_jcontext_free(xbt_context_t context);
\r
38 xbt_jcontext_kill(xbt_context_t context);
\r
41 xbt_jcontext_schedule(xbt_context_t context);
\r
44 xbt_jcontext_yield(void);
\r
47 xbt_jcontext_start(xbt_context_t context);
\r
50 xbt_jcontext_stop(int exit_code);
\r
53 xbt_jcontext_swap(xbt_context_t context);
\r
56 xbt_jcontext_schedule(xbt_context_t context);
\r
59 xbt_jcontext_yield(void);
\r
62 xbt_jcontext_suspend(xbt_context_t context);
\r
65 xbt_jcontext_resume(xbt_context_t context);
\r
68 /* callback: context fetching */
\r
70 xbt_jcontext_ex_ctx(void)
\r
72 return current_context->exception;
\r
75 /* callback: termination */
\r
77 xbt_jcontext_ex_terminate(xbt_ex_t *e)
\r
84 xbt_jcontext_factory_init(xbt_context_factory_t* factory)
\r
86 /* context exception handlers */
\r
87 __xbt_ex_ctx = xbt_jcontext_ex_ctx;
\r
88 __xbt_ex_terminate = xbt_jcontext_ex_terminate;
\r
90 /* instantiate the context factory */
\r
91 *factory = xbt_new0(s_xbt_context_factory_t,1);
\r
93 (*factory)->create_context = xbt_jcontext_factory_create_context;
\r
94 (*factory)->finalize = xbt_jcontext_factory_finalize;
\r
95 (*factory)->create_maestro_context = xbt_jcontext_factory_create_maestro_context;
\r
96 (*factory)->name = "jcontext_factory";
\r
102 xbt_jcontext_factory_create_maestro_context(xbt_context_t* maestro)
\r
104 xbt_jcontext_t context = xbt_new0(s_xbt_jcontext_t, 1);
\r
106 context->exception = xbt_new(ex_ctx_t,1);
\r
107 XBT_CTX_INITIALIZE(context->exception);
\r
109 *maestro = (xbt_context_t)context;
\r
115 xbt_jcontext_factory_finalize(xbt_context_factory_t* factory)
\r
117 free(maestro_context->exception);
\r
124 static xbt_context_t
\r
125 xbt_jcontext_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)
\r
127 xbt_jcontext_t context = xbt_new0(s_xbt_jcontext_t,1);
\r
129 context->name = xbt_strdup(name);
\r
131 context->cleanup_func = cleanup_func;
\r
132 context->cleanup_arg = cleanup_arg;
\r
134 context->exception = xbt_new(ex_ctx_t,1);
\r
135 XBT_CTX_INITIALIZE(context->exception);
\r
137 context->free = xbt_jcontext_free;
\r
138 context->kill = xbt_jcontext_kill;
\r
139 context->schedule = xbt_jcontext_schedule;
\r
140 context->yield = xbt_jcontext_yield;
\r
141 context->start = xbt_jcontext_start;
\r
142 context->stop = xbt_jcontext_stop;
\r
143 context->jprocess = (jobject)startup_arg;
\r
144 context->jenv = get_current_thread_env();
\r
146 return (xbt_context_t)context;
\r
150 xbt_jcontext_free(xbt_context_t context)
\r
154 xbt_jcontext_t jcontext = (xbt_jcontext_t)context;
\r
156 free(jcontext->name);
\r
158 if(jcontext->jprocess)
\r
160 jobject jprocess = jcontext->jprocess;
\r
161 jcontext->jprocess = NULL;
\r
163 /* if the java process is alive join it */
\r
164 if(jprocess_is_alive(jprocess,get_current_thread_env()))
\r
165 jprocess_join(jprocess,get_current_thread_env());
\r
168 if(jcontext->exception)
\r
169 free(jcontext->exception);
\r
177 xbt_jcontext_kill(xbt_context_t context)
\r
179 context->iwannadie = 1;
\r
180 xbt_jcontext_swap(context);
\r
184 * \param context the winner
\r
186 * Calling this function blocks the current context and schedule \a context.
\r
187 * When \a context will call xbt_context_yield, it will return
\r
188 * to this function as if nothing had happened.
\r
190 * Only the maestro can call this function to run a given process.
\r
193 xbt_jcontext_schedule(xbt_context_t context)
\r
195 xbt_assert0((current_context == maestro_context),"You are not supposed to run this function here!");
\r
196 xbt_jcontext_swap(context);
\r
200 * Calling this function makes the current context yield. The context
\r
201 * that scheduled it returns from xbt_context_schedule as if nothing
\r
204 * Only the processes can call this function, giving back the control
\r
208 xbt_jcontext_yield(void)
\r
210 xbt_assert0((current_context != maestro_context),"You are not supposed to run this function here!");
\r
211 jprocess_unschedule(current_context);
\r
215 xbt_jcontext_start(xbt_context_t context)
\r
217 jprocess_start(((xbt_jcontext_t)context)->jprocess,get_current_thread_env());
\r
221 xbt_jcontext_stop(int exit_code)
\r
223 jobject jprocess = NULL;
\r
224 xbt_jcontext_t jcontext;
\r
226 if(current_context->cleanup_func)
\r
227 (*(current_context->cleanup_func))(current_context->cleanup_arg);
\r
229 xbt_swag_remove(current_context, context_living);
\r
230 xbt_swag_insert(current_context, context_to_destroy);
\r
232 jcontext = (xbt_jcontext_t)current_context;
\r
234 if(jcontext->iwannadie)
\r
236 /* The maestro call xbt_context_stop() with an exit code set to one */
\r
237 if(jcontext->jprocess)
\r
239 /* if the java process is alive schedule it */
\r
240 if(jprocess_is_alive(jcontext->jprocess,get_current_thread_env()))
\r
242 jprocess_schedule(current_context);
\r
243 jprocess = jcontext->jprocess;
\r
244 jcontext->jprocess = NULL;
\r
246 /* interrupt the java process */
\r
247 jprocess_exit(jprocess,get_current_thread_env());
\r
254 /* the java process exits */
\r
255 jprocess = jcontext->jprocess;
\r
256 jcontext->jprocess = NULL;
\r
259 /* delete the global reference associated with the java process */
\r
260 jprocess_delete_global_ref(jprocess,get_current_thread_env());
\r
264 xbt_jcontext_swap(xbt_context_t context)
\r
268 xbt_context_t self = current_context;
\r
270 current_context = context;
\r
272 jprocess_schedule(context);
\r
274 current_context = self;
\r
277 if(current_context->iwannadie)
\r
278 xbt_jcontext_stop(1);
\r