1 /* Java Wrappers to the MSG API. */
3 /* Copyright (c) 2007, 2008, 2009, 2010. The SimGrid Team.
4 * All rights reserved. */
6 /* This program is free software; you can redistribute it and/or modify it
7 * under the terms of the license (GNU LGPL) which comes with this package. */
10 #include <simgrid/simix.h>
11 #include <surf/surfxml_parse.h>
14 #include "smx_context_java.h"
16 #include "jmsg_process.h"
18 #include "jmsg_host.h"
19 #include "jmsg_task.h"
20 #include "jmsg_application_handler.h"
21 #include "jxbt_utilities.h"
25 /* Shut up some errors in eclipse online compiler. I wish such a pimple wouldn't be needed */
32 /* end of eclipse-mandated pimple */
34 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(jmsg);
36 static JavaVM *__java_vm = NULL;
39 JavaVM *get_java_VM(void)
44 JNIEnv *get_current_thread_env(void)
48 (*__java_vm)->AttachCurrentThread(__java_vm, (void **) &env, NULL);
52 /***************************************************************************************
53 * Unsortable functions *
54 ***************************************************************************************/
56 JNIEXPORT jdouble JNICALL
57 Java_org_simgrid_msg_Msg_getClock(JNIEnv * env, jclass cls)
59 return (jdouble) MSG_get_clock();
62 JNIEXPORT void JNICALL
63 Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs)
71 smx_factory_initializer_to_use = SIMIX_ctx_java_factory_init;
74 argc = (int) (*env)->GetArrayLength(env, jargs);
77 argv = xbt_new(char *, argc + 1);
78 argv[0] = strdup("java");
80 for (index = 0; index < argc - 1; index++) {
81 jval = (jstring) (*env)->GetObjectArrayElement(env, jargs, index);
82 tmp = (*env)->GetStringUTFChars(env, jval, 0);
83 argv[index + 1] = strdup(tmp);
84 (*env)->ReleaseStringUTFChars(env, jval, tmp);
88 MSG_global_init(&argc, argv);
90 for (index = 0; index < argc; index++)
95 (*env)->GetJavaVM(env, &__java_vm);
98 JNIEXPORT void JNICALL
99 JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass cls)
107 XBT_INFO("Ready to run MSG_MAIN");
109 XBT_INFO("Done running MSG_MAIN");
110 jxbt_check_res("MSG_main()", rv, MSG_OK,
112 ("unexpected error : MSG_main() failed .. please report this bug "));
114 XBT_INFO("MSG_main finished");
116 XBT_INFO("Clean java world");
117 /* Cleanup java hosts */
118 hosts = MSG_hosts_as_dynar();
119 for (index = 0; index < xbt_dynar_length(hosts) - 1; index++) {
120 jhost = (jobject) MSG_host_get_data(xbt_dynar_get_as(hosts,index,m_host_t));
122 jhost_unref(env, jhost);
125 xbt_dynar_free(&hosts);
126 XBT_INFO("Clean native world");
128 JNIEXPORT void JNICALL
129 JNICALL Java_org_simgrid_msg_Msg_clean(JNIEnv * env, jclass cls)
131 /* cleanup native stuff. Calling it is ... useless since leaking memory at the end of the simulation is a non-issue */
132 MSG_error_t rv = MSG_OK != MSG_clean();
133 jxbt_check_res("MSG_clean()", rv, MSG_OK,
135 ("unexpected error : MSG_clean() failed .. please report this bug "));
138 JNIEXPORT void JNICALL
139 Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls,
140 jstring jplatformFile)
143 const char *platformFile =
144 (*env)->GetStringUTFChars(env, jplatformFile, 0);
146 MSG_create_environment(platformFile);
148 (*env)->ReleaseStringUTFChars(env, jplatformFile, platformFile);
151 JNIEXPORT void JNICALL
152 Java_org_simgrid_msg_Msg_info(JNIEnv * env, jclass cls, jstring js)
154 const char *s = (*env)->GetStringUTFChars(env, js, 0);
156 (*env)->ReleaseStringUTFChars(env, js, s);
159 JNIEXPORT void JNICALL
160 Java_org_simgrid_msg_Msg_deployApplication(JNIEnv * env, jclass cls,
161 jstring jdeploymentFile)
164 const char *deploymentFile =
165 (*env)->GetStringUTFChars(env, jdeploymentFile, 0);
167 surf_parse_reset_callbacks();
169 surfxml_add_callback(STag_surfxml_process_cb_list,
170 japplication_handler_on_begin_process);
172 surfxml_add_callback(ETag_surfxml_argument_cb_list,
173 japplication_handler_on_process_arg);
175 surfxml_add_callback(STag_surfxml_prop_cb_list,
176 japplication_handler_on_property);
178 surfxml_add_callback(ETag_surfxml_process_cb_list,
179 japplication_handler_on_end_process);
181 surf_parse_open(deploymentFile);
183 japplication_handler_on_start_document();
186 jxbt_throw_jni(env, "surf_parse() failed");
190 japplication_handler_on_end_document();
192 (*env)->ReleaseStringUTFChars(env, jdeploymentFile, deploymentFile);