X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/65ec6211dd03e9e6bc31e396393180cc29c27045..6bee07c05481cf59f8e8dbaff46629af3d254c06:/org/simgrid/msg/Msg.java diff --git a/org/simgrid/msg/Msg.java b/org/simgrid/msg/Msg.java index 883dbf5295..ba290f864a 100644 --- a/org/simgrid/msg/Msg.java +++ b/org/simgrid/msg/Msg.java @@ -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 @@ -11,56 +11,129 @@ 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 { + /* prefer the version on disk, if existing */ System.loadLibrary("SG_java"); - } catch(UnsatisfiedLinkError e) { + } 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(); + } + } } - /* FIXME: kill these C crufts */ - /** Returns the last error code of the simulation - * @return - */ - public final static native int getErrCode(); - - /** 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 * @@ -87,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.