Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
bundle the native library into the jar file
[simgrid.git] / org / simgrid / msg / Msg.java
index 557d2b4..ba290f8 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * JNI interface to C code for MSG.
  * 
- * Copyright 2006,2007,2010,2011 The SimGrid Team.           
+ * Copyright 2006-2012 The SimGrid Team.           
  * All right reserved. 
  *
  * This program is free software; you can redistribute 
 
 package org.simgrid.msg;
 
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.File;
+
+
 public final class Msg {
        /* Statically load the library which contains all native functions used in here */
        static {
                try {
-                       System.loadLibrary("libSG_java");
-               } catch(UnsatisfiedLinkError e) {
+                       /* prefer the version on disk, if existing */
+                       System.loadLibrary("SG_java");
+               } catch (UnsatisfiedLinkError e) {
+                       /* If not found, unpack the one bundled into the jar file and use it */
+                       loadLib("simgrid");
+                       loadLib("SG_java");
+               }
+       }
+       private static void loadLib (String name) {
+               String Path = "NATIVE/"+System.getProperty("os.name")+"/"+System.getProperty("os.arch")+"/";
+               String filename=name;
+               InputStream in = Msg.class.getClassLoader().getResourceAsStream(Path+filename);
+               
+               if (in == null) {
+                       filename = "lib"+name+".so";
+                       in = Msg.class.getClassLoader().getResourceAsStream(Path+filename);
+               } 
+               if (in == null) {
+                       filename = name+".dll";
+                       in = Msg.class.getClassLoader().getResourceAsStream(Path+filename);
+               }  
+               if (in == null) {
+                       filename = "lib"+name+".dylib";
+                       in = Msg.class.getClassLoader().getResourceAsStream(Path+filename);
+               }  
+               if (in == null) {
+                       throw new RuntimeException("Cannot find library "+name+" in path "+Path+". Sorry, but this jar does not seem to be usable on your machine.");
+               }
+// Caching the file on disk: desactivated because it could fool the users              
+//             if (new File(filename).isFile()) {
+//                     // file was already unpacked -- use it directly
+//                     System.load(new File(".").getAbsolutePath()+File.separator+filename);
+//                     return;
+//             }
+               try {
+                       // We must write the lib onto the disk before loading it -- stupid operating systems
+                       File fileOut = new File(filename);
+//                     if (!new File(".").canWrite()) {
+//                             System.out.println("Cannot write in ."+File.separator+filename+"; unpacking the library into a temporary file instead");
+                               fileOut = File.createTempFile("simgrid-", ".tmp");
+                               // don't leak the file on disk, but remove it on JVM shutdown
+                               Runtime.getRuntime().addShutdownHook(new Thread(new FileCleaner(fileOut.getAbsolutePath())));
+//                     }
+//                     System.out.println("Unpacking SimGrid native library to " + fileOut.getAbsolutePath());
+                       OutputStream out = new FileOutputStream(fileOut);
+                       
+                       /* copy the library in position */  
+                       byte[] buffer = new byte[4096]; 
+                       int bytes_read; 
+                       while ((bytes_read = in.read(buffer)) != -1)     // Read until EOF
+                               out.write(buffer, 0, bytes_read); 
+                     
+                       /* close all file descriptors, and load that shit */
+                       in.close();
+                       out.close();
+                       System.load(fileOut.getAbsolutePath());
+               } catch (Exception e) {
                        System.err.println("Cannot load the bindings to the simgrid library: ");
                        e.printStackTrace();
-                       System.err.println(
-                                       "Please check your LD_LIBRARY_PATH, or copy the simgrid and SG_java libraries to the current directory");
+                       System.err.println("This jar file does not seem to fit your system, sorry");
                        System.exit(1);
                }
+       }               
+       /* A hackish mechanism used to remove the file containing our library when the JVM shuts down */
+       private static class FileCleaner implements Runnable {
+               private String target;
+               public FileCleaner(String name) {
+                       target = name;
+               }
+        public void run() {
+            try {
+                new File(target).delete();
+            } catch(Exception e) {
+                System.out.println("Unable to clean temporary file "+target+" during shutdown.");
+                e.printStackTrace();
+            }
+        }    
        }
 
-       /** Everything is right. Keep on going the way ! */
-       public static final int SUCCESS = 0;
-
-       /** Something must be not perfectly clean (but I may be paranoid freak...) */
-       public static final int WARNING = 1;
-
-       /** There has been a problem during your task transfer.
-        *  Either the network is  down or the remote host has been shutdown */
-       public static final int TRANSFERT_FAILURE = 2;
-
-       /** System shutdown. 
-        *  The host on which you are running has just been rebooted.
-        *  Free your data structures and return now ! */
-       public static final int HOST_FAILURE = 3;
-
-       /** Canceled task. This task has been canceled by somebody ! */
-       public static final int TASK_CANCELLLED = 4;
-
-       /** You've done something wrong. You'd better look at it... */
-       public static final int FATAL_ERROR = 5;
-
     /** Retrieve the simulation time
      * @return
      */
        public final static native double getClock();
+       /**
+        * Issue a debug logging message.
+        * @param s message to log.
+        */
+       public final static native void debug(String s);
+       /**
+        * Issue an verbose logging message.
+        * @param s message to log.
+        */
+       public final static native void verb(String s);
 
-    /** Issue an information logging message
+       /** Issue an information logging message
      * @param s
      */
        public final static native void info(String s);
+       /**
+        * Issue an warning logging message.
+        * @param s message to log.
+        */
+       public final static native void warn(String s);
+       /**
+        * Issue an error logging message.
+        * @param s message to log.
+        */
+       public final static native void error(String s);
+       /**
+        * Issue an critical logging message.
+        * @param s message to log.
+        */
+       public final static native void critical(String s);
 
        /*********************************************************************************
         * Deployment and initialization related functions                               *
@@ -81,18 +160,9 @@ public final class Msg {
         */
        public final static native void run() ;
        
-       /**
-        * Cleanup the MSG simulation.
-        * 
-        * This function is only useful if you want to chain the simulations within 
-        * the same environment. But actually, it's not sure at all that cleaning the 
-        * JVM is faster than restarting a new one, so it's probable that using this 
-        * function is not a brilliant idea. Do so at own risk.
-        *      
-        * @see                    MSG_clean
-        */
-       public final static native void clean();
-       
+       /** This function is useless nowadays, just stop calling it. */
+       @Deprecated
+       public final static void clean(){}
 
        /**
         * The native implemented method to create the environment of the simulation.