Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
bca633f62f5af4953e320f395fbdd93781c7229b
[simgrid.git] / src / bindings / java / org / simgrid / msg / VM.java
1 /* Java bindings of the s4u::VirtualMachine */
2
3 /* Copyright (c) 2006-2019. The SimGrid Team. All rights reserved.          */
4
5 /* This program is free software; you can redistribute it and/or modify it
6  * under the terms of the license (GNU LGPL) which comes with this package. */
7
8 package org.simgrid.msg;
9
10 public class VM extends Host {
11         // No need to declare a new bind variable: we use the one inherited from the super class Host
12
13         private Host currentHost;
14         private int coreAmount = 1;
15
16         /**
17          * Create a `basic` VM : 1 core and 1GB of RAM.
18          * @param host Host node
19          * @param name name of the machine
20          */     
21         public VM(Host host, String name) {
22                 this(host,name, /*coreAmount*/1, 1024, 0, 0);
23         }
24
25         /**
26          * Create a VM without useless values (for humans)
27          * @param host Host node
28          * @param name name of the machine
29          * @param coreAmount the amount of cores of the VM
30          */     
31         public VM(Host host, String name, int coreAmount) {
32                 this(host,name, coreAmount, 1024, 0, 0);
33         }
34
35         /**
36          * Create a VM with 1 core
37          * @param host Host node
38          * @param name name of the machine
39          * @param ramSize size of the RAM that should be allocated (in MBytes)
40          * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
41          * @param dpIntensity (dirty page percentage according to migNetSpeed, [0-100], if you don't know put zero ;))
42          */     
43         public VM(Host host, String name, int ramSize, int migNetSpeed, int dpIntensity){
44                 this(host, name, /*coreAmount*/1, ramSize, migNetSpeed, dpIntensity);
45         }
46
47         /**
48          * Create a VM
49          * @param host Host node
50          * @param name name of the machine
51          * @param coreAmount the amount of cores of the VM
52          * @param ramSize size of the RAM that should be allocated (in MBytes)
53          * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
54          * @param dpIntensity (dirty page percentage according to migNetSpeed, [0-100], if you don't know put zero ;))
55          */
56         public VM(Host host, String name, int coreAmount, int ramSize, int migNetSpeed, int dpIntensity){
57                 super();
58                 super.name = name;
59                 this.currentHost = host;
60                 this.coreAmount = coreAmount;
61                 create(host, name, coreAmount, ramSize, migNetSpeed, dpIntensity);
62         }
63
64         /** Retrieve the list of all existing VMs */
65         public static native VM[] all();
66
67         /** Retrieve a VM from its name */
68         public static native VM getVMByName(String name);
69
70         /* Make sure that the GC also destroys the C object */
71         @Deprecated @Override
72         protected void finalize() throws Throwable {
73                 nativeFinalize();
74         }
75         private native void nativeFinalize();
76
77         /** Returns whether the given VM is currently suspended */      
78         public native int isCreated();
79
80         /** Returns whether the given VM is currently running */
81         public native int isRunning();
82
83         /** Returns whether the given VM is currently running */
84         public native int isMigrating();
85
86         /** Returns whether the given VM is currently suspended */      
87         public native int isSuspended();
88
89         /** Returns the amount of virtual CPUs provided */
90         public int getCoreAmount() {
91                 return coreAmount;
92         }
93         
94         /**
95          * Natively implemented method create the VM.
96          * @param ramSize size of the RAM that should be allocated (in MB)
97          * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
98          * @param dpIntensity (dirty page intensity, a percentage of migNetSpeed [0-100],  if you don't know put zero ;))
99          */
100         private native void create(Host host, String name, int coreAmount, int ramSize, int migNetSpeed, int dpIntensity);
101
102         /**
103          * Set a CPU bound for a given VM.
104          * @param bound in flops/s
105          */
106         public native void setBound(double bound);
107
108         /**  start the VM */
109         public native void start();
110
111         /**
112          * Immediately kills all processes within the given VM.
113          *
114          * No extra delay occurs. If you want to simulate this too, you want to use a MSG_process_sleep()
115          */
116         public native void shutdown();
117
118         /** Shutdown and unref the VM. */
119         public native void destroy();
120
121         /** Change the host on which all processes are running
122          * (pre-copy is implemented)
123          */     
124         public void migrate(Host destination) throws HostFailureException{
125                 try {
126                         this.nativeMigration(destination);
127                 } catch (Exception e){
128                   Msg.info("Migration of VM "+this.getName()+" to "+destination.getName()+" is impossible ("+e.getMessage()+")");
129                   throw new HostFailureException(e.getMessage());
130                 }
131                 // If the migration correcly returned, then we should change the currentHost value.
132                 this.currentHost = destination;
133         }
134         private native void nativeMigration(Host destination) throws MsgException;
135
136         /** Immediately suspend the execution of all processes within the given VM
137          *
138          * No suspension cost occurs. If you want to simulate this too, you want to use a @ref File.write() before or
139          * after, depending on the exact semantic of VM suspend to you.
140          */     
141         public native void suspend();
142
143         /** Immediately resumes the execution of all processes within the given VM
144          *
145          * No resume cost occurs. If you want to simulate this too, you want to use a @ref File.read() before or after,
146          * depending on the exact semantic of VM resume to you.
147          */
148         public native void resume();
149
150         /**  Class initializer (for JNI), don't do it yourself */
151         private static native void nativeInit();
152         static {
153                 nativeInit();
154         }
155 }