diff options
author | Tom Tromey <tromey@redhat.com> | 2001-12-12 20:58:41 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2001-12-12 20:58:41 +0000 |
commit | 415791dba8d7b002a594d1194d72ebdd94d05533 (patch) | |
tree | 583afb8fe11597ee27d6684ffdba15b2342474b8 | |
parent | 242f4945ac36aa5c3f6aecbd7e0420a1c9f73fb5 (diff) | |
download | gcc-415791dba8d7b002a594d1194d72ebdd94d05533.zip gcc-415791dba8d7b002a594d1194d72ebdd94d05533.tar.gz gcc-415791dba8d7b002a594d1194d72ebdd94d05533.tar.bz2 |
* jni.cc (call): Synchronize if required.
From-SVN: r47949
-rw-r--r-- | libjava/ChangeLog | 2 | ||||
-rw-r--r-- | libjava/jni.cc | 14 |
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); } |