Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fix github issue (#132)
[simgrid.git] / src / bindings / java / jmsg_host.cpp
1 /* Functions related to the java host instances.                            */
2
3 /* Copyright (c) 2007-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 #include "simgrid/plugins/energy.h"
9 #include "simgrid/plugins/load.h"
10 #include "simgrid/s4u/Host.hpp"
11 #include "simgrid/s4u/Storage.hpp"
12
13 #include "JavaContext.hpp"
14 #include "jmsg.hpp"
15 #include "jmsg_host.h"
16 #include "jmsg_storage.h"
17 #include "jxbt_utilities.hpp"
18
19 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java);
20
21 static jmethodID jhost_method_Host_constructor;
22 static jfieldID jhost_field_Host_bind;
23 static jfieldID jhost_field_Host_name;
24
25 jobject jhost_new_instance(JNIEnv * env) {
26   jclass cls = jxbt_get_class(env, "org/simgrid/msg/Host");
27   return env->NewObject(cls, jhost_method_Host_constructor);
28 }
29
30 jobject jhost_ref(JNIEnv * env, jobject jhost) {
31   return env->NewGlobalRef(jhost);
32 }
33
34 void jhost_unref(JNIEnv * env, jobject jhost) {
35   env->DeleteGlobalRef(jhost);
36 }
37
38 void jhost_bind(jobject jhost, msg_host_t host, JNIEnv * env) {
39   env->SetLongField(jhost, jhost_field_Host_bind, (jlong) (uintptr_t) (host));
40 }
41
42 msg_host_t jhost_get_native(JNIEnv * env, jobject jhost) {
43   return (msg_host_t) (uintptr_t) env->GetLongField(jhost, jhost_field_Host_bind);
44 }
45
46 JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_nativeInit(JNIEnv *env, jclass cls) {
47   jclass class_Host = env->FindClass("org/simgrid/msg/Host");
48   jhost_method_Host_constructor = env->GetMethodID(class_Host, "<init>", "()V");
49   jhost_field_Host_bind = jxbt_get_jfield(env,class_Host, "bind", "J");
50   jhost_field_Host_name = jxbt_get_jfield(env, class_Host, "name", "Ljava/lang/String;");
51   xbt_assert(class_Host && jhost_field_Host_name && jhost_method_Host_constructor && jhost_field_Host_bind,
52              "Native initialization of msg/Host failed. Please report that bug");
53 }
54
55 JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Host_getByName(JNIEnv * env, jclass cls, jstring jname) {
56
57   /* get the C string from the java string */
58   if (jname == nullptr) {
59     jxbt_throw_null(env, "No host can have a null name");
60     return nullptr;
61   }
62   const char *name = env->GetStringUTFChars(jname, 0);
63   /* get the host by name       (the hosts are created during the grid resolution) */
64   msg_host_t host = MSG_host_by_name(name);
65
66   if (not host) { /* invalid name */
67     jxbt_throw_host_not_found(env, name);
68     env->ReleaseStringUTFChars(jname, name);
69     return nullptr;
70   }
71   env->ReleaseStringUTFChars(jname, name);
72
73   if (not host->extension(JAVA_HOST_LEVEL)) { /* native host not associated yet with java host */
74     /* Instantiate a new java host */
75     jobject jhost = jhost_new_instance(env);
76
77     if (not jhost) {
78       jxbt_throw_jni(env, "java host instantiation failed");
79       return nullptr;
80     }
81
82     /* get a global reference to the newly created host */
83     jhost = jhost_ref(env, jhost);
84
85     if (not jhost) {
86       jxbt_throw_jni(env, "new global ref allocation failed");
87       return nullptr;
88     }
89     /* Sets the java host name */
90     env->SetObjectField(jhost, jhost_field_Host_name, jname);
91     /* bind the java host and the native host */
92     jhost_bind(jhost, host, env);
93
94     /* the native host data field is set with the global reference to the java host returned by this function */
95     host->extension_set(JAVA_HOST_LEVEL, (void *)jhost);
96   }
97
98   /* return the global reference to the java host instance */
99   return (jobject) host->extension(JAVA_HOST_LEVEL);
100 }
101
102 JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Host_currentHost(JNIEnv * env, jclass cls) {
103   jobject jhost;
104
105   msg_host_t host = MSG_host_self();
106
107   if (not host->extension(JAVA_HOST_LEVEL)) {
108     /* the native host not yet associated with the java host instance */
109
110     /* instanciate a new java host instance */
111     jhost = jhost_new_instance(env);
112
113     if (not jhost) {
114       jxbt_throw_jni(env, "java host instantiation failed");
115       return nullptr;
116     }
117
118     /* get a global reference to the newly created host */
119     jhost = jhost_ref(env, jhost);
120
121     if (not jhost) {
122       jxbt_throw_jni(env, "global ref allocation failed");
123       return nullptr;
124     }
125     /* Sets the host name */
126     jobject jname = env->NewStringUTF(host->get_cname());
127     env->SetObjectField(jhost, jhost_field_Host_name, jname);
128     /* Bind & store it */
129     jhost_bind(jhost, host, env);
130     host->extension_set(JAVA_HOST_LEVEL, (void *) jhost);
131   } else {
132     jhost = (jobject) host->extension(JAVA_HOST_LEVEL);
133   }
134
135   return jhost;
136 }
137
138 JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_on(JNIEnv *env, jobject jhost) {
139   msg_host_t host = jhost_get_native(env, jhost);
140   MSG_host_on(host);
141 }
142
143 JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_off(JNIEnv *env, jobject jhost) {
144   msg_host_t host = jhost_get_native(env, jhost);
145   if (not simgrid::kernel::context::StopRequest::try_n_catch([host]() { MSG_host_off(host); }))
146     jxbt_throw_host_failure(env, "");
147 }
148
149 JNIEXPORT jint JNICALL Java_org_simgrid_msg_Host_getCount(JNIEnv * env, jclass cls) {
150   xbt_dynar_t hosts =  MSG_hosts_as_dynar();
151   int nb_host = xbt_dynar_length(hosts);
152   xbt_dynar_free(&hosts);
153   return (jint) nb_host;
154 }
155
156 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getSpeed(JNIEnv * env, jobject jhost) {
157   msg_host_t host = jhost_get_native(env, jhost);
158
159   if (not host) {
160     jxbt_throw_notbound(env, "host", jhost);
161     return -1;
162   }
163
164   return (jdouble) MSG_host_get_speed(host);
165 }
166
167 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getCoreNumber(JNIEnv * env, jobject jhost) {
168   msg_host_t host = jhost_get_native(env, jhost);
169
170   if (not host) {
171     jxbt_throw_notbound(env, "host", jhost);
172     return -1;
173   }
174
175   return (jdouble) MSG_host_get_core_number(host);
176 }
177
178 JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Host_getProperty(JNIEnv *env, jobject jhost, jobject jname) {
179   msg_host_t host = jhost_get_native(env, jhost);
180
181   if (not host) {
182     jxbt_throw_notbound(env, "host", jhost);
183     return nullptr;
184   }
185   const char *name = env->GetStringUTFChars((jstring) jname, 0);
186
187   const char *property = MSG_host_get_property_value(host, name);
188   if (not property) {
189     return nullptr;
190   }
191
192   jobject jproperty = env->NewStringUTF(property);
193
194   env->ReleaseStringUTFChars((jstring) jname, name);
195
196   return jproperty;
197 }
198
199 JNIEXPORT void JNICALL
200 Java_org_simgrid_msg_Host_setProperty(JNIEnv *env, jobject jhost, jobject jname, jobject jvalue) {
201   msg_host_t host = jhost_get_native(env, jhost);
202
203   if (not host) {
204     jxbt_throw_notbound(env, "host", jhost);
205     return;
206   }
207   const char *name = env->GetStringUTFChars((jstring) jname, 0);
208   const char *value_java = env->GetStringUTFChars((jstring) jvalue, 0);
209   char *value = xbt_strdup(value_java);
210
211   MSG_host_set_property_value(host, name, value);
212
213   env->ReleaseStringUTFChars((jstring) jvalue, value_java);
214   env->ReleaseStringUTFChars((jstring) jname, name);
215 }
216
217 JNIEXPORT jboolean JNICALL Java_org_simgrid_msg_Host_isOn(JNIEnv * env, jobject jhost)
218 {
219   msg_host_t host = jhost_get_native(env, jhost);
220
221   if (not host) {
222     jxbt_throw_notbound(env, "host", jhost);
223     return 0;
224   }
225
226   return (jboolean) MSG_host_is_on(host);
227 }
228
229 JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Host_getMountedStorage(JNIEnv * env, jobject jhost)
230 {
231   msg_host_t host = jhost_get_native(env, jhost);
232   jobject jstorage;
233   jstring jname;
234
235   if (not host) {
236     jxbt_throw_notbound(env, "host", jhost);
237     return 0;
238   }
239
240   int index = 0;
241   jobjectArray jtable;
242   std::unordered_map<std::string, msg_storage_t> mounted_storages = host->get_mounted_storages();
243   int count  = mounted_storages.size();
244   jclass cls = env->FindClass("org/simgrid/msg/Storage");
245
246   jtable = env->NewObjectArray((jsize) count, cls, nullptr);
247
248   if (not jtable) {
249     jxbt_throw_jni(env, "Storages table allocation failed");
250     return nullptr;
251   }
252
253   for (auto const& elm : mounted_storages) {
254     jname    = env->NewStringUTF(elm.second->get_cname());
255     jstorage = Java_org_simgrid_msg_Storage_getByName(env,cls,jname);
256     env->SetObjectArrayElement(jtable, index, jstorage);
257     index++;
258   }
259   return jtable;
260 }
261
262 JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Host_getAttachedStorage(JNIEnv * env, jobject jhost)
263 {
264   msg_host_t host = jhost_get_native(env, jhost);
265
266   if (not host) {
267     jxbt_throw_notbound(env, "host", jhost);
268     return 0;
269   }
270   jobjectArray jtable;
271
272   xbt_dynar_t dyn = sg_host_get_attached_storage_list(host);
273   jclass cls      = jxbt_get_class(env, "java/lang/String");
274   jtable          = env->NewObjectArray(static_cast<jsize>(xbt_dynar_length(dyn)), cls, nullptr);
275   unsigned int index;
276   const char* storage_name;
277   jstring jstorage_name;
278   xbt_dynar_foreach (dyn, index, storage_name) {
279     jstorage_name = env->NewStringUTF(storage_name);
280     env->SetObjectArrayElement(jtable, index, jstorage_name);
281   }
282   xbt_dynar_free_container(&dyn);
283   return jtable;
284 }
285
286 JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Host_getStorageContent(JNIEnv * env, jobject jhost)
287 {
288   msg_host_t host = jhost_get_native(env, jhost);
289
290   if (not host) {
291     jxbt_throw_notbound(env, "host", jhost);
292     return 0;
293   }
294   return (jobjectArray)MSG_host_get_storage_content(host);
295 }
296
297 JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Host_all(JNIEnv * env, jclass cls_arg)
298 {
299
300   xbt_dynar_t table =  MSG_hosts_as_dynar();
301   int count = xbt_dynar_length(table);
302
303   jclass cls = jxbt_get_class(env, "org/simgrid/msg/Host");
304   if (not cls)
305     return nullptr;
306
307   jobjectArray jtable = env->NewObjectArray((jsize)count, cls, nullptr);
308
309   if (not jtable) {
310     jxbt_throw_jni(env, "Hosts table allocation failed");
311     return nullptr;
312   }
313
314   for (int index = 0; index < count; index++) {
315     msg_host_t host = xbt_dynar_get_as(table, index, msg_host_t);
316     jobject jhost   = static_cast<jobject>(host->extension(JAVA_HOST_LEVEL));
317
318     if (not jhost) {
319       jstring jname = env->NewStringUTF(host->get_cname());
320       jhost         = Java_org_simgrid_msg_Host_getByName(env, cls_arg, jname);
321     }
322
323     env->SetObjectArrayElement(jtable, index, jhost);
324   }
325   xbt_dynar_free(&table);
326   return jtable;
327 }
328
329 JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_setAsyncMailbox(JNIEnv * env, jclass cls_arg, jobject jname)
330 {
331   const char *name = env->GetStringUTFChars((jstring) jname, 0);
332   sg_mailbox_set_receiver(name);
333   env->ReleaseStringUTFChars((jstring) jname, name);
334 }
335
336 JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_updateAllEnergyConsumptions(JNIEnv* env, jclass cls)
337 {
338   sg_host_energy_update_all();
339 }
340
341 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getConsumedEnergy (JNIEnv *env, jobject jhost)
342 {
343   msg_host_t host = jhost_get_native(env, jhost);
344
345   if (not host) {
346     jxbt_throw_notbound(env, "host", jhost);
347     return 0;
348   }
349
350   return MSG_host_get_consumed_energy(host);
351 }
352
353 JNIEXPORT void JNICALL Java_org_simgrid_msg_Host_setPstate(JNIEnv* env, jobject jhost, jint pstate)
354 {
355   msg_host_t host = jhost_get_native(env, jhost);
356   MSG_host_set_pstate(host, pstate);
357 }
358 JNIEXPORT jint JNICALL Java_org_simgrid_msg_Host_getPstate(JNIEnv* env, jobject jhost)
359 {
360   msg_host_t host = jhost_get_native(env, jhost);
361   return MSG_host_get_pstate(host);
362 }
363 JNIEXPORT jint JNICALL Java_org_simgrid_msg_Host_getPstatesCount(JNIEnv* env, jobject jhost)
364 {
365   msg_host_t host = jhost_get_native(env, jhost);
366   return MSG_host_get_nb_pstates(host);
367 }
368 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getCurrentPowerPeak(JNIEnv* env, jobject jhost)
369 {
370   msg_host_t host = jhost_get_native(env, jhost);
371   return MSG_host_get_speed(host);
372 }
373 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getPowerPeakAt(JNIEnv* env, jobject jhost, jint pstate)
374 {
375   msg_host_t host = jhost_get_native(env, jhost);
376   return MSG_host_get_power_peak_at(host, pstate);
377 }
378
379 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getLoad(JNIEnv* env, jobject jhost)
380 {
381   msg_host_t host = jhost_get_native(env, jhost);
382   return MSG_host_get_load(host);
383 }
384
385 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getCurrentLoad (JNIEnv *env, jobject jhost)
386 {
387   msg_host_t host = jhost_get_native(env, jhost);
388
389   if (not host) {
390     jxbt_throw_notbound(env, "host", jhost);
391     return 0;
392   }
393
394   return MSG_host_get_current_load(host);
395 }
396
397 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getComputedFlops (JNIEnv *env, jobject jhost)
398 {
399   msg_host_t host = jhost_get_native(env, jhost);
400
401   if (not host) {
402     jxbt_throw_notbound(env, "host", jhost);
403     return 0;
404   }
405
406   return MSG_host_get_computed_flops(host);
407 }
408
409 JNIEXPORT jdouble JNICALL Java_org_simgrid_msg_Host_getAvgLoad (JNIEnv *env, jobject jhost)
410 {
411   msg_host_t host = jhost_get_native(env, jhost);
412
413   if (not host) {
414     jxbt_throw_notbound(env, "host", jhost);
415     return 0;
416   }
417
418   return MSG_host_get_avg_load(host);
419 }