diff options
Diffstat (limited to 'libjava/java/lang/natRuntime.cc')
-rw-r--r-- | libjava/java/lang/natRuntime.cc | 9 |
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 (); |