X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7f4e5b2ed2874cf5ab13b7fbe0cebff788cb5019..611d822b02f836d7abe031cced6adc4281ef4356:/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 b9becc6856..8a9b10868f 100644 --- a/src/bindings/java/org/simgrid/msg/VM.java +++ b/src/bindings/java/org/simgrid/msg/VM.java @@ -1,64 +1,78 @@ -/* 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-2018. 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 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 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 bandwith 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){ + 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 */ + 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(); @@ -71,14 +85,18 @@ public class VM extends Host { /** Returns whether the given VM is currently suspended */ public native int isSuspended(); + /** 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 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. @@ -89,51 +107,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(); } - // If the migration correcly returned, then we should change the currentHost value. - this.currentHost = destination; + // If the migration correcly 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(); /** Class initializer (for JNI), don't do it yourself */ - public static native void nativeInit(); + private static native void nativeInit(); static { nativeInit(); }