Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of https://github.com/mpoquet/simgrid
[simgrid.git] / src / bindings / java / org / simgrid / NativeLib.java
index 853302b..11578d4 100644 (file)
@@ -85,51 +85,45 @@ public final class NativeLib {
        }
 
        /** Try to extract the library from the jarfile before loading it */
-       private static boolean loadLibAsStream (String name) throws SecurityException, IOException, UnsatisfiedLinkError {
+       private static boolean loadLibAsStream (String name) throws IOException, UnsatisfiedLinkError {
                String path = NativeLib.getPath();
                
+               // We must write the lib onto the disk before loading it -- stupid operating systems
+               if (tempDir == null) {
+                       tempDir = Files.createTempDirectory("simgrid-java-");
+                       // don't leak the files on disk, but remove it on JVM shutdown
+                       Runtime.getRuntime().addShutdownHook(new Thread(new FileCleaner(tempDir.toFile())));
+               }
+               
                /* For each possible filename of the given library on all possible OSes, try it */
                for (String filename : new String[] 
                   { name, 
                     "lib"+name+".so",               /* linux */
                     name+".dll", "lib"+name+".dll", /* windows (pure and mingw) */
                     "lib"+name+".dylib"             /* mac osx */}) {
-                       
-                       InputStream in = NativeLib.class.getClassLoader().getResourceAsStream(path+filename);
-                       if (in == null)
-                               continue; // Try the next name: no such file found
-                       
-                       OutputStream out = null;
-                       try {
-                               // We must write the lib onto the disk before loading it -- stupid operating systems
-                               if (tempDir == null) {
-                                       tempDir = Files.createTempDirectory("simgrid-java-");
-                                       // don't leak the files on disk, but remove it on JVM shutdown
-                                       Runtime.getRuntime().addShutdownHook(new Thread(new FileCleaner(tempDir.toFile())));
-                               }
-                               File fileOut = new File(tempDir.toFile().getAbsolutePath() + File.separator + filename);
+                                               
+                       File fileOut = new File(tempDir.toFile().getAbsolutePath() + File.separator + filename);
+                       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 */  
-                               out = new FileOutputStream(fileOut);
                                byte[] buffer = new byte[4096]; 
                                int bytesRead; 
                                while ((bytesRead = in.read(buffer)) != -1)     // Read until EOF
                                        out.write(buffer, 0, bytesRead); 
                                
+                               out.close(); // Windows cannot open it twice, so close it first. Shame.
+                               
                                /* load that shit */
                                System.load(fileOut.getAbsolutePath());
                                
                                /* It loaded! we're good */
                                return true;
                                
-                       } finally {
-                               /* Always close all descriptors, no matter success or error */
-                               try { 
-                                       in.close();
-                                       out.close();
-                               } catch (IOException e) {
-                                       /* Too bad. I dont care. */
-                               }
                        }
                }
                
@@ -170,12 +164,12 @@ public final class NativeLib {
                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.");                                
+                                       if (! f.delete() && !f.getAbsolutePath().contains("appveyor")) // Be silent on AppVeyor to not break the tests. Ugly trick :)
+                                               System.out.println("Unable to clean temporary file "+f.getAbsolutePath()+" during shutdown.");
+                               if (! dir.delete() && !dir.getAbsolutePath().contains("appveyor") )
+                                       System.out.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown.");                                
                        } catch(Exception e) {
-                               System.err.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown: "+e.getCause());
+                               System.out.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown: "+e.getCause());
                                e.printStackTrace();
                        }
                }