|
From: <br...@us...> - 2009-08-03 06:38:50
|
Revision: 3985
http://openvrml.svn.sourceforge.net/openvrml/?rev=3985&view=rev
Author: braden
Date: 2009-08-03 06:38:42 +0000 (Mon, 03 Aug 2009)
Log Message:
-----------
Converted Java scripting backend to use libopenvrml-dl to load libjvm rather than using libltdl directly.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/Makefile.am
trunk/src/local/libopenvrml-dl/openvrml/local/dl.cpp
trunk/src/local/libopenvrml-dl/openvrml/local/dl.h
trunk/src/script/java.cpp
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2009-08-02 07:56:29 UTC (rev 3984)
+++ trunk/ChangeLog 2009-08-03 06:38:42 UTC (rev 3985)
@@ -1,3 +1,27 @@
+2009-08-03 Braden McDaniel <br...@en...>
+
+ Converted Java scripting backend to use libopenvrml-dl to load
+ libjvm rather than using libltdl directly.
+
+ * src/Makefile.am
+ (script_java_la_CPPFLAGS): Add the libopenvrml-dl source directory
+ to the include path.
+ (script_java_la_LIBADD): Added libopenvrml-dl.
+ * src/local/libopenvrml-dl/openvrml/local/dl.cpp: Added function
+ openvrml::local::dl::prepend_to_searchpath.
+ * src/local/libopenvrml-dl/openvrml/local/dl.h: Added function
+ openvrml::local::dl::prepend_to_searchpath.
+ * src/script/java.cpp
+ (create_searchpath_from_java_home(const std::string &)): Removed;
+ replaced with prepend_java_home_libdirs_to_searchpath.
+ (prepend_java_home_libdirs_to_searchpath(const std::string &)):
+ Given a location for the Java Runtime Environment, prepend the
+ possible locations of libjvm to the runtime library search path.
+ (load_libjvm::load_libjvm()): Use libopenvrml-dl functions instead
+ of libltdl ones.
+ (load_libjvm::~load_libjvm()): Use libopenvrml-dl functions instead
+ of libltdl ones.
+
2009-08-02 Braden McDaniel <br...@en...>
Removed obsolete -I flags when building libopenvrml.
Modified: trunk/src/Makefile.am
===================================================================
--- trunk/src/Makefile.am 2009-08-02 07:56:29 UTC (rev 3984)
+++ trunk/src/Makefile.am 2009-08-03 06:38:42 UTC (rev 3985)
@@ -163,6 +163,7 @@
-I$(top_builddir)/src/libopenvrml \
-I$(top_srcdir)/src/libopenvrml \
-I$(top_builddir)/src/script/java \
+ -I$(top_srcdir)/src/local/libopenvrml-dl \
-DOPENVRML_LIBDIR_=\"$(libdir)\" \
-DOPENVRML_PKGDATADIR_=\"$(pkgdatadir)\" \
-DJAVA_HOME=\"$(JAVA_HOME)\" \
@@ -174,7 +175,8 @@
-no-undefined \
-avoid-version
script_java_la_LIBADD = \
- libopenvrml/libopenvrml.la
+ libopenvrml/libopenvrml.la \
+ local/libopenvrml-dl.la
openvrmlnodedir = $(pkglibdir)/node
openvrmlnode_LTLIBRARIES = \
Modified: trunk/src/local/libopenvrml-dl/openvrml/local/dl.cpp
===================================================================
--- trunk/src/local/libopenvrml-dl/openvrml/local/dl.cpp 2009-08-02 07:56:29 UTC (rev 3984)
+++ trunk/src/local/libopenvrml-dl/openvrml/local/dl.cpp 2009-08-03 06:38:42 UTC (rev 3985)
@@ -117,6 +117,21 @@
# endif
}
+/**
+ * @internal
+ *
+ * @brief Prepend @p dir to the dynamic library search path.
+ */
+int openvrml::local::dl::prepend_to_searchpath(const char * const dir)
+{
+# ifdef _WIN32
+ return SetDllDirectory(dir);
+# else
+ const char * const before = lt_dlgetsearchpath();
+ return lt_dlinsertsearchdir(before, dir);
+# endif
+}
+
openvrml::local::dl::handle openvrml::local::dl::open(const char * filename)
{
# ifdef _WIN32
Modified: trunk/src/local/libopenvrml-dl/openvrml/local/dl.h
===================================================================
--- trunk/src/local/libopenvrml-dl/openvrml/local/dl.h 2009-08-02 07:56:29 UTC (rev 3984)
+++ trunk/src/local/libopenvrml-dl/openvrml/local/dl.h 2009-08-03 06:38:42 UTC (rev 3985)
@@ -44,6 +44,8 @@
int (*func)(const char * filename, void * data),
void * data);
+ OPENVRML_LOCAL int prepend_to_searchpath(const char * dir);
+
# ifdef _WIN32
typedef HMODULE handle;
# else
Modified: trunk/src/script/java.cpp
===================================================================
--- trunk/src/script/java.cpp 2009-08-02 07:56:29 UTC (rev 3984)
+++ trunk/src/script/java.cpp 2009-08-03 06:38:42 UTC (rev 3985)
@@ -79,10 +79,10 @@
# include <vrml_node_Node.h>
# include <vrml_node_Script.h>
+# include <openvrml/local/dl.h>
# include <openvrml/browser.h>
# include <openvrml/scene.h>
# include <private.h>
-# include <ltdl.h>
# include <boost/array.hpp>
# include <boost/filesystem/path.hpp>
# include <boost/multi_index/detail/scope_guard.hpp>
@@ -101,7 +101,7 @@
namespace {
- OPENVRML_JAVA_LOCAL lt_dlhandle libjvm_handle;
+ OPENVRML_JAVA_LOCAL openvrml::local::dl::handle libjvm_handle;
OPENVRML_JAVA_LOCAL jint (*CreateJavaVM)(JavaVM **, void **, void *);
OPENVRML_JAVA_LOCAL JavaVM * vm;
@@ -112,54 +112,78 @@
~load_libjvm();
} load_libjvm_;
- OPENVRML_JAVA_LOCAL const std::string
- create_searchpath_from_java_home(const std::string & java_home)
+ OPENVRML_JAVA_LOCAL
+ int
+ prepend_java_home_libdirs_to_searchpath(const std::string & java_home)
{
assert(!java_home.empty());
- std::ostringstream searchpath;
- searchpath << java_home << "/lib/" << OPENVRML_JVM_ARCH << "/client:"
- << java_home << "/lib/" << OPENVRML_JVM_ARCH << "/server";
- return searchpath.str();
+
+ using std::ostringstream;
+ using namespace openvrml::local;
+
+ static const ostringstream::iostate exceptions = ostringstream::eofbit
+ | ostringstream::failbit
+ | ostringstream::badbit;
+ int result = 0;
+ {
+ ostringstream libdir;
+ libdir.exceptions(exceptions);
+ libdir << java_home << "/lib/" << OPENVRML_JVM_ARCH << "/client";
+ result = dl::prepend_to_searchpath(libdir.str().c_str());
+ if (result != 0) { return result; }
+ }
+ {
+ ostringstream libdir;
+ libdir.exceptions(exceptions);
+ libdir << java_home << "/lib/" << OPENVRML_JVM_ARCH << "/server";
+ result = dl::prepend_to_searchpath(libdir.str().c_str());
+ if (result != 0) { return result; }
+ }
+ return result;
}
load_libjvm::load_libjvm()
{
- int result = lt_dlinit();
+ using namespace openvrml::local;
+
+ int result = dl::init();
if (result != 0) {
- std::cerr << lt_dlerror() << std::endl;
+ std::cerr << dl::error() << std::endl;
return;
}
- std::ostringstream jvm_searchpath;
- const char * const java_home_env = getenv("JAVA_HOME");
- if (java_home_env) {
- jvm_searchpath << create_searchpath_from_java_home(java_home_env);
- }
const std::string java_home = JAVA_HOME;
- if (!java_home.empty()
- && (!java_home_env || java_home != java_home_env)) {
- if (!jvm_searchpath.str().empty()) { jvm_searchpath << ':'; }
- jvm_searchpath << create_searchpath_from_java_home(java_home);
+ if (!java_home.empty()) {
+ result = prepend_java_home_libdirs_to_searchpath(java_home);
+ if (result != 0) {
+ std::cerr << dl::error() << std::endl;
+ return;
+ }
}
- result = lt_dlsetsearchpath(jvm_searchpath.str().c_str());
- if (result != 0) {
- std::cerr << lt_dlerror() << std::endl;
- return;
+ const char * const java_home_env = getenv("JAVA_HOME");
+ if (java_home_env && (java_home_env != java_home)) {
+ result = prepend_java_home_libdirs_to_searchpath(java_home_env);
+ if (result != 0) {
+ std::cerr << dl::error() << std::endl;
+ return;
+ }
}
- libjvm_handle = lt_dlopen("libjvm.so");
+ libjvm_handle = dl::open("libjvm");
if (!libjvm_handle) {
std::cerr << lt_dlerror() << std::endl;
return;
}
CreateJavaVM =
reinterpret_cast<jint (*)(JavaVM **, void **, void *)>(
- lt_dlsym(libjvm_handle, "JNI_CreateJavaVM"));
+ dl::sym(libjvm_handle, "JNI_CreateJavaVM"));
if (!CreateJavaVM) {
- std::cerr << lt_dlerror() << std::endl;
+ std::cerr << dl::error() << std::endl;
}
}
load_libjvm::~load_libjvm()
{
+ using namespace openvrml::local;
+
//
// The Java VM doesn't seem to play very nicely with DestroyJavaVM; it
// seems to wait for some internal threads to finish; and they never
@@ -173,13 +197,13 @@
// vm->DestroyJavaVM();
// }
if (libjvm_handle) {
- int result = lt_dlclose(libjvm_handle);
+ int result = dl::close(libjvm_handle);
if (result != 0) {
- std::cerr << lt_dlerror() << std::endl;
+ std::cerr << dl::error() << std::endl;
return;
}
}
- lt_dlexit();
+ dl::exit();
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|