aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang/natRuntime.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/lang/natRuntime.cc')
-rw-r--r--libjava/java/lang/natRuntime.cc9
1 files changed, 8 insertions, 1 deletions
diff --git a/libjava/java/lang/natRuntime.cc b/libjava/java/lang/natRuntime.cc
index 0551ba6..18bc3cb 100644
--- a/libjava/java/lang/natRuntime.cc
+++ b/libjava/java/lang/natRuntime.cc
@@ -138,8 +138,15 @@ java::lang::Runtime::_load (jstring path, jboolean do_search)
#endif
jsize total = JvGetStringUTFRegion (path, 0, path->length(), &buf[offset]);
buf[offset + total] = '\0';
+ lt_dlhandle h;
// FIXME: make sure path is absolute.
- lt_dlhandle h = do_search ? lt_dlopenext (buf) : lt_dlopen (buf);
+ {
+ // Synchronize on java.lang.Class. This is to protect the class chain from
+ // concurrent modification by class registration calls which may be run
+ // during the dlopen().
+ JvSynchronize sync (&java::lang::Class::class$);
+ h = do_search ? lt_dlopenext (buf) : lt_dlopen (buf);
+ }
if (h == NULL)
{
const char *msg = lt_dlerror ();