Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
kill ALL trailing whitespace (and deprecate a function in Link)
[simgrid.git] / src / bindings / java / org / simgrid / msg / VM.java
1 /* Java bindings of the s4u::VirtualMachine */
2
3 /* Copyright (c) 2006-2017. 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         protected void finalize() throws Throwable {
72                 nativeFinalize();
73         }
74         private native void nativeFinalize();
75
76         /** Returns whether the given VM is currently suspended */      
77         public native int isCreated();
78
79         /** Returns whether the given VM is currently running */
80         public native int isRunning();
81
82         /** Returns whether the given VM is currently running */
83         public native int isMigrating();
84
85         /** Returns whether the given VM is currently suspended */      
86         public native int isSuspended();
87
88         /** Returns the amount of virtual CPUs provided */
89         public int getCoreAmount() {
90                 return coreAmount;
91         }
92         
93         /**
94          * Natively implemented method create the VM.
95          * @param ramSize size of the RAM that should be allocated (in MB)
96          * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
97          * @param dpIntensity (dirty page intensity, a percentage of migNetSpeed [0-100],  if you don't know put zero ;))
98          */
99         private native void create(Host host, String name, int coreAmount, int ramSize, int migNetSpeed, int dpIntensity);
100
101         /**
102          * Set a CPU bound for a given VM.
103          * @param bound in flops/s
104          */
105         public native void setBound(double bound);
106
107         /**  start the VM */
108         public native void start();
109
110         /**
111          * Immediately kills all processes within the given VM.
112          *
113          * No extra delay occurs. If you want to simulate this too, you want to use a MSG_process_sleep()
114          */
115         public native void shutdown();
116
117         /** Shutdown and unref the VM. */
118         public native void destroy();
119
120         /** Change the host on which all processes are running
121          * (pre-copy is implemented)
122          */     
123         public void migrate(Host destination) throws HostFailureException{
124                 try {
125                         this.nativeMigration(destination);
126                 } catch (Exception e){
127                   Msg.info("Migration of VM "+this.getName()+" to "+destination.getName()+" is impossible ("+e.getMessage()+")");
128                   throw new HostFailureException();
129                 }
130                 // If the migration correcly returned, then we should change the currentHost value.
131                 this.currentHost = destination;
132         }
133         private native void nativeMigration(Host destination) throws MsgException;
134
135         /** Immediately suspend the execution of all processes within the given VM
136          *
137          * No suspension cost occurs. If you want to simulate this too, you want to use a \ref File.write() before or
138          * after, depending on the exact semantic of VM suspend to you.
139          */     
140         public native void suspend();
141
142         /** Immediately resumes the execution of all processes within the given VM
143          *
144          * No resume cost occurs. If you want to simulate this too, you want to use a \ref File.read() before or after,
145          * depending on the exact semantic of VM resume to you.
146          */
147         public native void resume();
148
149         /**  Class initializer (for JNI), don't do it yourself */
150         private static native void nativeInit();
151         static {
152                 nativeInit();
153         }
154 }