From: Martin Quinson Date: Tue, 21 Mar 2017 22:37:57 +0000 (+0100) Subject: Implement VM::all() as a native, and use it in tests X-Git-Tag: v3_15~23 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/ab74c9ce5c149e95d518e126e728a693470b9941 Implement VM::all() as a native, and use it in tests This is to kill the array of all VMs in the java world, that retains references to the VMs that thus cannot be cleaned. One method to go and I'm good with it. --- diff --git a/examples/java/cloud/masterworker/Master.java b/examples/java/cloud/masterworker/Master.java index 55e01cce22..c7012cdf04 100644 --- a/examples/java/cloud/masterworker/Master.java +++ b/examples/java/cloud/masterworker/Master.java @@ -26,19 +26,18 @@ public class Master extends Process { int workersCount = Main.NHOSTS; for (int step = 1; step <= Main.NSTEPS ; step++) { - ArrayList vms = new ArrayList<>(); // Create one VM per host and bind a process inside each one. for (int i = 0; i < workersCount; i++) { Msg.verb("create VM0-s"+step+"-"+i); VM vm = new VM(hosts[i+1],"VM0-s"+step+"-"+i); vm.start(); - vms.add(vm); Worker worker= new Worker(vm,"WK:"+step+":"+ i); Msg.verb("Put Worker "+worker.getName()+ " on "+vm.getName()); worker.start(); } + VM[] vms = VM.all(); - Msg.info("Launched " + vms.size() + " VMs"); + Msg.info("Launched " + vms.length + " VMs"); Msg.info("Send some work to everyone"); workBatch(workersCount,"WK:"+step+":"); diff --git a/src/bindings/java/jmsg_vm.cpp b/src/bindings/java/jmsg_vm.cpp index 7e58e6a476..031238f24b 100644 --- a/src/bindings/java/jmsg_vm.cpp +++ b/src/bindings/java/jmsg_vm.cpp @@ -15,6 +15,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); SG_BEGIN_DECL() +extern int JAVA_HOST_LEVEL; static jfieldID jvm_field_bind; void jvm_bind(JNIEnv *env, jobject jvm, msg_vm_t vm) @@ -75,6 +76,44 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_create(JNIEnv* env, jobject jvm, env->ReleaseStringUTFChars(jname, name); jvm_bind(env, jvm, vm); + jvm = env->NewWeakGlobalRef(jvm); + // We use the extension level of the host, even if that's somehow disturbing + vm->extension_set(JAVA_HOST_LEVEL, (void*)jvm); +} + +JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_VM_all(JNIEnv* env, jclass cls_arg) +{ + xbt_dynar_t hosts = MSG_hosts_as_dynar(); + std::vector vms; + + unsigned int it; + msg_host_t h; + xbt_dynar_foreach (hosts, it, h) { + simgrid::s4u::VirtualMachine* vm = dynamic_cast(h); + if (vm != nullptr && vm->getState() != SURF_VM_STATE_DESTROYED) { + jobject jvm = static_cast(vm->extension(JAVA_HOST_LEVEL)); + vms.push_back(jvm); + } + } + + vms.shrink_to_fit(); + int count = vms.size(); + + jclass cls = jxbt_get_class(env, "org/simgrid/msg/VM"); + if (!cls) + return nullptr; + + jobjectArray jtable = env->NewObjectArray((jsize)count, cls, nullptr); + if (!jtable) { + jxbt_throw_jni(env, "Hosts table allocation failed"); + return nullptr; + } + + for (int index = 0; index < count; index++) { + jobject jhost = vms.at(index); + env->SetObjectArrayElement(jtable, index, jhost); + } + return jtable; } JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_nativeFinalize(JNIEnv *env, jobject jvm) diff --git a/src/bindings/java/jmsg_vm.h b/src/bindings/java/jmsg_vm.h index cb0dfdc996..70106d7957 100644 --- a/src/bindings/java/jmsg_vm.h +++ b/src/bindings/java/jmsg_vm.h @@ -25,33 +25,25 @@ SG_BEGIN_DECL() void jvm_bind(JNIEnv *env, jobject jvm, msg_vm_t vm); msg_vm_t jvm_get_native(JNIEnv *env, jobject jvm); -/* - * Class org_simgrid_msg_VM - * Method nativeInit - * Signature ()V - */ -JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_nativeInit(JNIEnv *env, jclass cls); - -/** - * Class org_simgrid_msg_VM - * Method isCreated - * Signature ()B - */ -JNIEXPORT jint JNICALL Java_org_simgrid_msg_VM_isCreated(JNIEnv *env, jobject jvm); - -JNIEXPORT jint JNICALL Java_org_simgrid_msg_VM_isRunning(JNIEnv *env, jobject jvm); -JNIEXPORT jint JNICALL Java_org_simgrid_msg_VM_isMigrating(JNIEnv *env, jobject jvm); -JNIEXPORT jint JNICALL Java_org_simgrid_msg_VM_isSuspended(JNIEnv *env, jobject jvm); -JNIEXPORT jint JNICALL Java_org_simgrid_msg_VM_isResuming(JNIEnv *env, jobject jvm); -JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_setBound(JNIEnv *env, jobject jvm, jdouble bound); +JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_nativeInit(JNIEnv* env, jclass cls); + +JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_VM_all(JNIEnv* env, jclass cls_arg); + +JNIEXPORT jint JNICALL Java_org_simgrid_msg_VM_isCreated(JNIEnv* env, jobject jvm); + +JNIEXPORT jint JNICALL Java_org_simgrid_msg_VM_isRunning(JNIEnv* env, jobject jvm); +JNIEXPORT jint JNICALL Java_org_simgrid_msg_VM_isMigrating(JNIEnv* env, jobject jvm); +JNIEXPORT jint JNICALL Java_org_simgrid_msg_VM_isSuspended(JNIEnv* env, jobject jvm); +JNIEXPORT jint JNICALL Java_org_simgrid_msg_VM_isResuming(JNIEnv* env, jobject jvm); +JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_setBound(JNIEnv* env, jobject jvm, jdouble bound); JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_create(JNIEnv* env, jobject jvm, jobject jhost, jstring jname, jint jramsize, jint dprate, jint mig_netspeed); -JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_nativeFinalize(JNIEnv *env, jobject jvm); -JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_start(JNIEnv *env, jobject jvm); +JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_nativeFinalize(JNIEnv* env, jobject jvm); +JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_start(JNIEnv* env, jobject jvm); JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_nativeMigration(JNIEnv* env, jobject jvm, jobject jhost); -JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_suspend(JNIEnv *env, jobject jvm); -JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_resume(JNIEnv *env, jobject jvm); -JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_shutdown(JNIEnv *env, jobject jvm); +JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_suspend(JNIEnv* env, jobject jvm); +JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_resume(JNIEnv* env, jobject jvm); +JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_shutdown(JNIEnv* env, jobject jvm); SG_END_DECL() diff --git a/src/bindings/java/org/simgrid/msg/VM.java b/src/bindings/java/org/simgrid/msg/VM.java index 867eed8909..bfd271544c 100644 --- a/src/bindings/java/org/simgrid/msg/VM.java +++ b/src/bindings/java/org/simgrid/msg/VM.java @@ -11,8 +11,6 @@ import java.util.ArrayList; public class VM extends Host { // No need to declare a new bind variable: we use the one inherited from the super class Host - /* Static functions */ - private static ArrayList vms= new ArrayList<>(); private Host currentHost; @@ -37,11 +35,7 @@ public class VM extends Host { vms.add(this); } - public static VM[] all(){ - VM[] allvms = new VM[vms.size()]; - vms.toArray(allvms); - return allvms; - } + public native static VM[] all(); public static VM getVMByName(String name){ for (VM vm : vms){ @@ -108,9 +102,6 @@ public class VM extends Host { */ public native void shutdown(); - /** native migration routine */ - private native void nativeMigration(Host destination) throws Exception; - /** Change the host on which all processes are running * (pre-copy is implemented) */ @@ -124,6 +115,7 @@ public class VM extends Host { // If the migration correcly returned, then we should change the currentHost value. this.currentHost = destination; } + private native void nativeMigration(Host destination) throws Exception; /** Immediately suspend the execution of all processes within the given VM *