[[[
JavaHL: Support keeping global reference to the callback java object as
required by the RA API due to callback being used across method calls
[ in subversion/bindings/javahl/native ]
* CommitCallback.cpp, CommitCallback.h
(CommitCallback, ~CommitCallback): Add handling of additional
parameter and state when requesting a global reference to be kept
]]]
Index: subversion/bindings/javahl/native/CommitCallback.h
===================================================================
--- subversion/bindings/javahl/native/CommitCallback.h (revision 1328758)
+++ subversion/bindings/javahl/native/CommitCallback.h (working copy)
@@ -37,7 +37,7 @@
class CommitCallback
{
public:
- CommitCallback(jobject jcallback);
+ CommitCallback(jobject jcallback, bool keepGlobalRef = false);
~CommitCallback();
static svn_error_t *callback(const svn_commit_info_t *commit_info,
@@ -49,9 +49,14 @@ class CommitCallback
private:
/**
- * This a local reference to the Java object.
+ * This a reference to the Java object.
*/
jobject m_callback;
+
+ /**
+ * Is the reference we are keeping global or local
+ */
+ bool globalRef;
};
#endif // COMMITCALLBACK_H
Index: subversion/bindings/javahl/native/CommitCallback.cpp
===================================================================
--- subversion/bindings/javahl/native/CommitCallback.cpp (revision
1328758)
+++ subversion/bindings/javahl/native/CommitCallback.cpp (working copy)
@@ -36,9 +36,24 @@
* Create a CommitCallback object
* @param jcallback the Java callback object.
*/
-CommitCallback::CommitCallback(jobject jcallback)
+CommitCallback::CommitCallback(jobject jcallback, bool keepGlobalRef)
{
- m_callback = jcallback;
+ globalRef = false;
+
+ if(!keepGlobalRef)
+ {
+ m_callback = jcallback;
+ return;
+ }
+
+ JNIEnv *env = JNIUtil::getEnv();
+ m_callback = env->NewGlobalRef(jcallback);
+ if (JNIUtil::isJavaExceptionThrown())
+ {
+ return;
+ }
+
+ globalRef = true;
}
/**
@@ -46,9 +61,13 @@
*/
CommitCallback::~CommitCallback()
{
- // The m_callback does not need to be destroyed because it is the
- // passed in parameter to the Java SVNClientInterface.logMessages
- // method.
+ // If we are holding global reference to the callback object
+ // we need to destroy it
+ if(globalRef && m_callback != NULL)
+ {
+ JNIEnv *env = JNIUtil::getEnv();
+ env->DeleteGlobalRef(m_callback);
+ }
}
svn_error_t *