aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2001-12-12 20:58:41 +0000
committerTom Tromey <tromey@gcc.gnu.org>2001-12-12 20:58:41 +0000
commit415791dba8d7b002a594d1194d72ebdd94d05533 (patch)
tree583afb8fe11597ee27d6684ffdba15b2342474b8
parent242f4945ac36aa5c3f6aecbd7e0420a1c9f73fb5 (diff)
downloadgcc-415791dba8d7b002a594d1194d72ebdd94d05533.zip
gcc-415791dba8d7b002a594d1194d72ebdd94d05533.tar.gz
gcc-415791dba8d7b002a594d1194d72ebdd94d05533.tar.bz2
* jni.cc (call): Synchronize if required.
From-SVN: r47949
-rw-r--r--libjava/ChangeLog2
-rw-r--r--libjava/jni.cc14
2 files changed, 16 insertions, 0 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 8596f4c..d41ff8d 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,5 +1,7 @@
2001-12-12 Tom Tromey <tromey@redhat.com>
+ * jni.cc (call): Synchronize if required.
+
* gij.cc (main): Clarify --help output.
* gnu/gcj/runtime/StringBuffer.java
diff --git a/libjava/jni.cc b/libjava/jni.cc
index dbe1d1f..1dd299f 100644
--- a/libjava/jni.cc
+++ b/libjava/jni.cc
@@ -2066,6 +2066,17 @@ _Jv_JNIMethod::call (ffi_cif *, void *ret, ffi_raw *args, void *__this)
if ((_this->self->accflags & java::lang::reflect::Modifier::STATIC))
real_args[offset++].ptr = _this->defining_class;
+ // In libgcj, the callee synchronizes.
+ jobject sync = NULL;
+ if ((_this->self->accflags & java::lang::reflect::Modifier::SYNCHRONIZED))
+ {
+ if ((_this->self->accflags & java::lang::reflect::Modifier::STATIC))
+ sync = _this->defining_class;
+ else
+ sync = (jobject) args[0].ptr;
+ _Jv_MonitorEnter (sync);
+ }
+
// Copy over passed-in arguments.
memcpy (&real_args[offset], args, _this->args_raw_size);
@@ -2073,6 +2084,9 @@ _Jv_JNIMethod::call (ffi_cif *, void *ret, ffi_raw *args, void *__this)
ffi_raw_call (&_this->jni_cif, (void (*)()) _this->function,
ret, real_args);
+ if (sync != NULL)
+ _Jv_MonitorExit (sync);
+
_Jv_JNI_PopSystemFrame (env);
}