X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a5ef2273f8ae4fa34c8b355067219b86d9a12a2e..ce930ad96b622e2b3856b7d9c3d97e60ec2c93a1:/src/bindings/java/org/simgrid/NativeLib.java diff --git a/src/bindings/java/org/simgrid/NativeLib.java b/src/bindings/java/org/simgrid/NativeLib.java index 8386e68026..a338cc3e93 100644 --- a/src/bindings/java/org/simgrid/NativeLib.java +++ b/src/bindings/java/org/simgrid/NativeLib.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2014-2019. 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. */ @@ -12,23 +12,24 @@ import java.io.OutputStream; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; +import java.util.stream.Stream; -/** Helper class loading the native functions of SimGrid that we use for downcalls - * - * Almost all org.simgrid.msg.* classes contain a static bloc (thus executed when the class is loaded) +/** Helper class loading the native functions of SimGrid that we use for downcalls + * + * Almost all org.simgrid.msg.* classes contain a static bloc (thus executed when the class is loaded) * containing a call to this. */ public final class NativeLib { private static boolean isNativeInited = false; - static Path tempDir = null; // where the embeeded libraries are unpacked before loading them + private static Path tempDir = null; // where the embeeded libraries are unpacked before loading them /** A static-only "class" don't need no constructor */ private NativeLib() { throw new IllegalAccessError("Utility class"); } - /** Hidden debug main() function - * + /** Hidden debug main() function + * * It is not the Main-Class defined in src/bindings/java/MANIFEST.in (org.simgrid.msg.Msg is), * so it won't get executed by default. But that's helpful to debug linkage errors, if you * know that it exists. It's used by cmake during the configure, to inform the user. @@ -69,9 +70,9 @@ public final class NativeLib { System.err.println("\nCannot load the bindings to the "+name+" library in path "+getPath()+" and no usable SimGrid installation found on disk."); if (cause != null) { - if (cause.getMessage().matches(".*libcgraph.so.*")) + if (cause.getMessage().contains("libcgraph.so")) System.err.println("HINT: Try to install the libcgraph package (sudo apt-get install libcgraph)."); - else if (cause.getMessage().matches(".*libboost_context.so.*")) + else if (cause.getMessage().contains("libboost_context.so")) System.err.println("HINT: Try to install the boost-context package (sudo apt-get install libboost-context-dev)."); else System.err.println("Try to install the missing dependencies, if any. Read carefully the following error message."); @@ -79,7 +80,7 @@ public final class NativeLib { System.err.println(); cause.printStackTrace(); } else { - System.err.println("This jar file does not seem to fit your system, and no usable SimGrid installation found on disk."); + System.err.println("This jar file does not seem to fit your system, and no usable SimGrid installation found on disk for "+name+"."); } System.exit(1); } @@ -96,32 +97,33 @@ public final class NativeLib { } /* For each possible filename of the given library on all possible OSes, try it */ - for (String filename : new String[] - { name, + for (String filename : new String[] + { name, "lib"+name+".so", /* linux */ name+".dll", "lib"+name+".dll", /* windows (pure and mingw) */ - "lib"+name+".dylib" /* mac osx */}) { + "lib"+name+".dylib" /* macOS */}) { File fileOut = new File(tempDir.toFile().getAbsolutePath() + File.separator + filename); + boolean done = false; try ( // Try-with-resources. These stream will be autoclosed when needed. InputStream in = NativeLib.class.getClassLoader().getResourceAsStream(path+filename); OutputStream out = new FileOutputStream(fileOut); ) { - if (in == null) - continue; // Try the next name: no such file found - - /* copy the library in position */ - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = in.read(buffer)) != -1) // Read until EOF - out.write(buffer, 0, bytesRead); - - /* load that shit */ + if (in != null) { + /* copy the library in position */ + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = in.read(buffer)) != -1) // Read until EOF + out.write(buffer, 0, bytesRead); + done = true; + } + } + if (done) { + /* load that library */ System.load(fileOut.getAbsolutePath()); - + /* It loaded! we're good */ return true; - } } @@ -141,11 +143,11 @@ public final class NativeLib { else if ("x86_64".equalsIgnoreCase(arch) || "AMD64".equalsIgnoreCase(arch)) arch = "amd64"; - if (os.toLowerCase().startsWith("win")){ + if (os.toLowerCase().startsWith("win")) { os = "Windows"; - } else if (os.contains("OS X")) + } else if (os.contains("OS X")) { os = "Darwin"; - + } os = os.replace(' ', '_'); arch = arch.replace(' ', '_'); @@ -160,16 +162,15 @@ public final class NativeLib { } @Override public void run() { - try { - for (File f : dir.listFiles()) - if (! f.delete() ) - System.err.println("Unable to clean temporary file "+f.getAbsolutePath()+" during shutdown."); - if (! dir.delete() ) - System.err.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown."); + try (Stream paths = Files.walk(dir.toPath())) { + paths.sorted(java.util.Comparator.reverseOrder()) + .map(java.nio.file.Path::toFile) + //.peek(System.out::println) // Prints what gets removed + .forEach(java.io.File::delete); } catch(Exception e) { - System.err.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown: "+e.getCause()); + System.out.println("Error while cleaning temporary file "+dir.getAbsolutePath()+" during shutdown: "+e.getCause()); e.printStackTrace(); - } + } } } }