1 /* JNI interface to virtual machine in Simgrid */
3 /* Copyright (c) 2006-2014. 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. */
9 package org.simgrid.msg;
10 import java.util.ArrayList;
12 public class VM extends Host{
13 // Please note that we are not declaring a new bind variable
14 //(the bind variable has been inherited from the super class Host)
16 /* Static functions */
17 // GetByName is inherited from the super class Host
20 private static ArrayList<VM> vms= new ArrayList<>();
21 private Host currentHost;
23 /* Constructors / destructors */
25 * Create a `basic' VM (i.e. 1GB of RAM, other values are not taken into account).
27 public VM(Host host, String name) {
28 this(host,name,1024, 0, 0);
33 * @param host Host node
34 * @param name name of the machine
35 * @param ramSize size of the RAM that should be allocated (in MBytes)
36 * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
37 * @param dpIntensity (dirty page percentage according to migNetSpeed, [0-100], if you don't know put zero ;))
39 public VM(Host host, String name, int ramSize, int migNetSpeed, int dpIntensity){
42 this.currentHost = host;
43 create(host, name, ramSize, migNetSpeed, dpIntensity);
47 public static VM[] all(){
48 VM[] allvms = new VM[vms.size()];
53 public static VM getVMByName(String name){
55 if (vm.getName().equals(name))
61 public void destroy() {
64 private native void nativeFinalize();
67 /* JNI / Native code */
69 /* get/set property methods are inherited from the Host class. */
71 /** Returns whether the given VM is currently suspended
73 public native int isCreated();
75 /** Returns whether the given VM is currently running
77 public native int isRunning();
79 /** Returns whether the given VM is currently running
81 public native int isMigrating();
83 /** Returns whether the given VM is currently suspended
85 public native int isSuspended();
87 /** Returns whether the given VM is currently saving
89 public native int isSaving();
91 /** Returns whether the given VM is currently saved
93 public native int isSaved();
95 /** Returns whether the given VM is currently restoring its state
97 public native boolean isRestoring();
100 * Natively implemented method create the VM.
101 * @param ramSize size of the RAM that should be allocated (in MB)
102 * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
103 * @param dpIntensity (dirty page intensity, a percentage of migNetSpeed [0-100], if you don't know put zero ;))
105 private native void create(Host host, String name, int ramSize, int migNetSpeed, int dpIntensity);
109 * Set a CPU bound for a given VM.
110 * @param bound in flops/s
112 public native void setBound(double bound);
117 public native void start();
121 * Immediately kills all processes within the given VM. Any memory that they allocated will be leaked.
122 * No extra delay occurs. If you want to simulate this too, you want to use a MSG_process_sleep() or something
124 public native void shutdown();
127 * Invoke native migration routine
129 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);
133 /** Change the host on which all processes are running
134 * (pre-copy is implemented)
136 public void migrate(Host destination) throws HostFailureException{
138 this.internalmig(destination);
139 } catch (Exception e){
140 Msg.info("Migration of VM "+this.getName()+" to "+destination.getName()+" is impossible ("+e.getMessage()+")");
141 throw new HostFailureException();
143 // If the migration correcly returned, then we should change the currentHost value.
144 this.currentHost = destination;
147 /** Immediately suspend the execution of all processes within the given VM
149 * No suspension cost occurs. If you want to simulate this too, you want to
150 * use a \ref File.write() before or after, depending on the exact semantic
151 * of VM suspend to you.
153 public native void suspend();
155 /** Immediately resumes the execution of all processes within the given VM
157 * No resume cost occurs. If you want to simulate this too, you want to
158 * use a \ref File.read() before or after, depending on the exact semantic
159 * of VM resume to you.
161 public native void resume();
163 /** Immediately suspend the execution of all processes within the given VM
164 * and save its state on the persistent HDD
165 * Not yet implemented (for the moment it behaves like suspend)
166 * No suspension cost occurs. If you want to simulate this too, you want to
167 * use a \ref File.write() before or after, depending on the exact semantic
168 * of VM suspend to you.
170 public native void save();
172 /** Immediately resumes the execution of all processes previously saved
173 * within the given VM
174 * Not yet implemented (for the moment it behaves like resume)
176 * No resume cost occurs. If you want to simulate this too, you want to
177 * use a \ref File.read() before or after, depending on the exact semantic
178 * of VM resume to you.
180 public native void restore();
184 * Class initializer, to initialize various JNI stuff
186 public static native void nativeInit();