int workersCount = Main.NHOSTS;
for (int step = 1; step <= Main.NSTEPS ; step++) {
- ArrayList<VM> 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+":");
SG_BEGIN_DECL()
+extern int JAVA_HOST_LEVEL;
static jfieldID jvm_field_bind;
void jvm_bind(JNIEnv *env, jobject jvm, msg_vm_t vm)
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<jobject> vms;
+
+ unsigned int it;
+ msg_host_t h;
+ xbt_dynar_foreach (hosts, it, h) {
+ simgrid::s4u::VirtualMachine* vm = dynamic_cast<simgrid::s4u::VirtualMachine*>(h);
+ if (vm != nullptr && vm->getState() != SURF_VM_STATE_DESTROYED) {
+ jobject jvm = static_cast<jobject>(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)
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()
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<VM> vms= new ArrayList<>();
private Host currentHost;
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){
*/
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)
*/
// 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
*