X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ff976abdc0f201064cd0fb608c39990ba2656561..5ed37babb2fa9097abe82df299c0aa259ed84d5a:/src/bindings/java/org/simgrid/msg/VM.java diff --git a/src/bindings/java/org/simgrid/msg/VM.java b/src/bindings/java/org/simgrid/msg/VM.java index a393c95aac..05d7acfd43 100644 --- a/src/bindings/java/org/simgrid/msg/VM.java +++ b/src/bindings/java/org/simgrid/msg/VM.java @@ -1,93 +1,106 @@ -/* JNI interface to virtual machine in Simgrid */ +/* Java bindings of the s4u::VirtualMachine */ -/* Copyright (c) 2006-2014. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2006-2023. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ package org.simgrid.msg; -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 Host currentHost; + private int coreAmount = 1; - private static ArrayList vms= new ArrayList<>(); - private Host currentHost; - - /** Create a `basic' VM (i.e. 1GB of RAM, other values are not taken into account). */ + /** + * Create a `basic` VM : 1 core and 1GB of RAM. + * @param host Host node + * @param name name of the machine + */ public VM(Host host, String name) { - this(host,name,1024, 0, 0); + this(host,name, /*coreAmount*/1, 1024, 0, 0); } /** - * Create a VM + * Create a VM without useless values (for humans) + * @param host Host node + * @param name name of the machine + * @param coreAmount the amount of cores of the VM + */ + public VM(Host host, String name, int coreAmount) { + this(host,name, coreAmount, 1024, 0, 0); + } + + /** + * Create a VM with 1 core * @param host Host node * @param name name of the machine * @param ramSize size of the RAM that should be allocated (in MBytes) - * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;)) + * @param migNetSpeed (network bandwidth allocated for migrations in MB/s, if you don't know put zero ;)) * @param dpIntensity (dirty page percentage according to migNetSpeed, [0-100], if you don't know put zero ;)) */ public VM(Host host, String name, int ramSize, int migNetSpeed, int dpIntensity){ + this(host, name, /*coreAmount*/1, ramSize, migNetSpeed, dpIntensity); + } + + /** + * Create a VM + * @param host Host node + * @param name name of the machine + * @param coreAmount the amount of cores of the VM + * @param ramSize size of the RAM that should be allocated (in MBytes) + * @param migNetSpeed (network bandwidth allocated for migrations in MB/s, if you don't know put zero ;)) + * @param dpIntensity (dirty page percentage according to migNetSpeed, [0-100], if you don't know put zero ;)) + */ + public VM(Host host, String name, int coreAmount, int ramSize, int migNetSpeed, int dpIntensity){ super(); super.name = name; - this.currentHost = host; - create(host, name, ramSize, migNetSpeed, dpIntensity); - vms.add(this); + this.currentHost = host; + this.coreAmount = coreAmount; + create(host, name, coreAmount, ramSize, migNetSpeed, dpIntensity); } - public static VM[] all(){ - VM[] allvms = new VM[vms.size()]; - vms.toArray(allvms); - return allvms; - } + /** Retrieve the list of all existing VMs */ + public static native VM[] all(); - public static VM getVMByName(String name){ - for (VM vm : vms){ - if (vm.getName().equals(name)) - return vm; - } - return null; - } - - public void destroy() { + /** Retrieve a VM from its name */ + public static native VM getVMByName(String name); + + /** + * Make sure that the GC also destroys the C object + * @deprecated (from Java9 onwards) + */ + @Deprecated @Override + protected void finalize() throws Throwable { nativeFinalize(); } private native void nativeFinalize(); - - /* JNI / Native code */ - - /** Returns whether the given VM is currently suspended */ - public native int isCreated(); + /** Returns whether the given VM is currently suspended */ + public native boolean isCreated(); /** Returns whether the given VM is currently running */ - public native int isRunning(); + public native boolean isRunning(); /** Returns whether the given VM is currently running */ - public native int isMigrating(); - - /** Returns whether the given VM is currently suspended */ - public native int isSuspended(); + public native boolean isMigrating(); - /** Returns whether the given VM is currently saving */ - public native int isSaving(); + /** Returns whether the given VM is currently suspended */ + public native boolean isSuspended(); - /** Returns whether the given VM is currently saved */ - public native int isSaved(); - - /** Returns whether the given VM is currently restoring its state */ - public native boolean isRestoring(); + /** Returns the amount of virtual CPUs provided */ + public int getCoreAmount() { + return coreAmount; + } /** * Natively implemented method create the VM. * @param ramSize size of the RAM that should be allocated (in MB) - * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;)) + * @param migNetSpeed (network bandwidth allocated for migrations in MB/s, if you don't know put zero ;)) * @param dpIntensity (dirty page intensity, a percentage of migNetSpeed [0-100], if you don't know put zero ;)) */ - private native void create(Host host, String name, int ramSize, int migNetSpeed, int dpIntensity); - + private native void create(Host host, String name, int coreAmount, int ramSize, int migNetSpeed, int dpIntensity); /** * Set a CPU bound for a given VM. @@ -98,70 +111,47 @@ public class VM extends Host { /** start the VM */ public native void start(); - /** - * Immediately kills all processes within the given VM. - * + * Immediately kills all processes within the given VM. + * * No extra delay occurs. If you want to simulate this too, you want to use a MSG_process_sleep() */ public native void shutdown(); - /** Invoke native migration routine */ - public native void internalmig(Host destination) throws Exception; // TODO add throws DoubleMigrationException (i.e. when you call migrate on a VM that is already migrating); - - + /** Shutdown and unref the VM. */ + public native void destroy(); /** Change the host on which all processes are running * (pre-copy is implemented) - */ + */ public void migrate(Host destination) throws HostFailureException{ try { - this.internalmig(destination); + this.nativeMigration(destination); } catch (Exception e){ Msg.info("Migration of VM "+this.getName()+" to "+destination.getName()+" is impossible ("+e.getMessage()+")"); - throw new HostFailureException(); + throw new HostFailureException(e.getMessage()); } - // If the migration correcly returned, then we should change the currentHost value. - this.currentHost = destination; + // If the migration correctly returned, then we should change the currentHost value. + this.currentHost = destination; } + private native void nativeMigration(Host destination) throws MsgException; /** Immediately suspend the execution of all processes within the given VM * - * No suspension cost occurs. If you want to simulate this too, you want to - * use a \ref File.write() before or after, depending on the exact semantic - * of VM suspend to you. - */ + * No suspension cost occurs. If you want to simulate this too, you want to use a @ref File.write() before or + * after, depending on the exact semantic of VM suspend to you. + */ public native void suspend(); /** Immediately resumes the execution of all processes within the given VM * - * No resume cost occurs. If you want to simulate this too, you want to - * use a \ref File.read() before or after, depending on the exact semantic - * of VM resume to you. + * No resume cost occurs. If you want to simulate this too, you want to use a @ref File.read() before or after, + * depending on the exact semantic of VM resume to you. */ public native void resume(); - /** Immediately suspend the execution of all processes within the given VM - * and save its state on the persistent HDD - * Not yet implemented (for the moment it behaves like suspend) - * No suspension cost occurs. If you want to simulate this too, you want to - * use a \ref File.write() before or after, depending on the exact semantic - * of VM suspend to you. - */ - public native void save(); - - /** Immediately resumes the execution of all processes previously saved - * within the given VM - * Not yet implemented (for the moment it behaves like resume) - * - * No resume cost occurs. If you want to simulate this too, you want to - * use a \ref File.read() before or after, depending on the exact semantic - * of VM resume to you. - */ - public native void restore(); - /** Class initializer (for JNI), don't do it yourself */ - public static native void nativeInit(); + private static native void nativeInit(); static { nativeInit(); }