Actually track the JNI MonitorEnter/MonitorExit calls.
Also log if we do end up having to clean up behind a detaching thread.
Also add a few missing "static"s.
Change-Id: I4ba1734b04b9a6dde112f3693a6dd171b42cd69c
diff --git a/src/jni_internal.cc b/src/jni_internal.cc
index 00667ad..dba933a 100644
--- a/src/jni_internal.cc
+++ b/src/jni_internal.cc
@@ -2224,14 +2224,24 @@
static jint MonitorEnter(JNIEnv* env, jobject java_object) {
ScopedJniThreadState ts(env);
- Decode<Object*>(ts, java_object)->MonitorEnter(ts.Self());
- return ts.Self()->IsExceptionPending() ? JNI_ERR : JNI_OK;
+ Object* o = Decode<Object*>(ts, java_object);
+ o->MonitorEnter(ts.Self());
+ if (ts.Self()->IsExceptionPending()) {
+ return JNI_ERR;
+ }
+ ts.Env()->monitors.Add(o);
+ return JNI_OK;
}
static jint MonitorExit(JNIEnv* env, jobject java_object) {
ScopedJniThreadState ts(env);
- Decode<Object*>(ts, java_object)->MonitorExit(ts.Self());
- return ts.Self()->IsExceptionPending() ? JNI_ERR : JNI_OK;
+ Object* o = Decode<Object*>(ts, java_object);
+ o->MonitorExit(ts.Self());
+ if (ts.Self()->IsExceptionPending()) {
+ return JNI_ERR;
+ }
+ ts.Env()->monitors.Remove(o);
+ return JNI_OK;
}
static jint GetJavaVM(JNIEnv* env, JavaVM** vm) {