You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by br...@apache.org on 2015/04/28 17:26:27 UTC
svn commit: r1676564 - in /subversion/trunk/subversion/bindings/javahl:
native/EditorProxy.cpp native/NativeStream.cpp native/NativeStream.hpp
src/org/apache/subversion/javahl/remote/StatusEditor.java
Author: brane
Date: Tue Apr 28 15:26:27 2015
New Revision: 1676564
URL: http://svn.apache.org/r1676564
Log:
Make JNI reference handling more robust in RA status callbacks.
This is a follow-up to r1675771.
* subversion/bindings/javahl/native/EditorProxy.cpp
(EditorProxy::cb_add_directory,
EditorProxy::cb_add_file,
EditorProxy::cb_add_symlink,
EditorProxy::cb_add_absent,
EditorProxy::cb_alter_directory,
EditorProxy::cb_alter_file,
EditorProxy::cb_alter_symlink,
EditorProxy::cb_delete,
EditorProxy::cb_copy,
EditorProxy::cb_move,
EditorProxy::cb_complete,
EditorProxy::cb_abort): Use a managed local JNI frame in callbacks.
* subversion/bindings/javahl/native/NativeStream.hpp
(NativeInputStream::get_self_unsafe,
NativeOutputStream::get_self_unsafe): New.
* subversion/bindings/javahl/native/NativeStream.cpp
(NativeInputStream::get_self_unsafe,
NativeOutputStream::get_self_unsafe): Implement.
(Java_org_apache_subversion_javahl_types_NativeInputStream_finalize,
Java_org_apache_subversion_javahl_types_NativeOutputStream_finalize):
Implement missing finalizer methods.
* subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java
(StatusEditor.addFile): Check contents stream for null before closing.
Modified:
subversion/trunk/subversion/bindings/javahl/native/EditorProxy.cpp
subversion/trunk/subversion/bindings/javahl/native/NativeStream.cpp
subversion/trunk/subversion/bindings/javahl/native/NativeStream.hpp
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java
Modified: subversion/trunk/subversion/bindings/javahl/native/EditorProxy.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/EditorProxy.cpp?rev=1676564&r1=1676563&r2=1676564&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/EditorProxy.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/EditorProxy.cpp Tue Apr 28 15:26:27 2015
@@ -151,29 +151,32 @@ EditorProxy::cb_add_directory(void *bato
apr_pool_t *scratch_pool)
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_add_directory('%s')\n", relpath);
-
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep->m_valid)
- return invalid_editor();
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "addDirectory",
- "(Ljava/lang/String;"
- "Ljava/lang/Iterable;"
- "Ljava/util/Map;J)V"));
-
- jstring jrelpath = JNIUtil::makeJString(relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jchildren = (!children ? NULL : CreateJ::StringSet(children));
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid,
- jrelpath, jchildren, jprops,
- jlong(replaces_rev)),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "addDirectory",
+ "(Ljava/lang/String;"
+ "Ljava/lang/Iterable;"
+ "Ljava/util/Map;J)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jchildren = (!children ? NULL : CreateJ::StringSet(children));
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jchildren, jprops,
+ jlong(replaces_rev));
+ });
return SVN_NO_ERROR;
}
@@ -187,36 +190,37 @@ EditorProxy::cb_add_file(void *baton,
apr_pool_t *scratch_pool)
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_add_file('%s')\n", relpath);
-
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "addFile",
- "(Ljava/lang/String;"
- "L"JAVA_PACKAGE"/types/Checksum;"
- "Ljava/io/InputStream;"
- "Ljava/util/Map;J)V"));
-
- jstring jrelpath = JNIUtil::makeJString(relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jchecksum = CreateJ::Checksum(checksum);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jcontents = NULL;
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
-
- if (contents != NULL)
- SVN_JAVAHL_CATCH(Java::Env(), SVN_ERR_RA_SVN_EDIT_ABORTED,
- jcontents = wrap_input_stream(contents));
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid,
- jrelpath, jchecksum, jcontents,
- jprops, jlong(replaces_rev)),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "addFile",
+ "(Ljava/lang/String;"
+ "L"JAVA_PACKAGE"/types/Checksum;"
+ "Ljava/io/InputStream;"
+ "Ljava/util/Map;J)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jchecksum = CreateJ::Checksum(checksum);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ jobject jcontents = NULL;
+ if (contents != NULL)
+ jcontents = wrap_input_stream(contents);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jchecksum, jcontents,
+ jprops, jlong(replaces_rev));
+ });
return SVN_NO_ERROR;
}
@@ -229,29 +233,32 @@ EditorProxy::cb_add_symlink(void *baton,
apr_pool_t *scratch_pool)
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_add_symlink('%s')\n", relpath);
-
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "addSymlink",
- "(Ljava/lang/String;"
- "Ljava/lang/String;"
- "Ljava/util/Map;J)V"));
-
- jstring jrelpath = JNIUtil::makeJString(relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jstring jtarget = JNIUtil::makeJString(target);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid,
- jrelpath, jtarget, jprops,
- jlong(replaces_rev)),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "addSymlink",
+ "(Ljava/lang/String;"
+ "Ljava/lang/String;"
+ "Ljava/util/Map;J)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jstring jtarget = JNIUtil::makeJString(target);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jtarget, jprops,
+ jlong(replaces_rev));
+ });
return SVN_NO_ERROR;
}
@@ -263,27 +270,30 @@ EditorProxy::cb_add_absent(void *baton,
apr_pool_t *scratch_pool)
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_add_absent('%s')\n", relpath);
-
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "addAbsent",
- "(Ljava/lang/String;"
- "L"JAVA_PACKAGE"/types/NodeKind;"
- "J)V"));
-
- jstring jrelpath = JNIUtil::makeJString(relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jkind = EnumMapper::mapNodeKind(kind);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid,
- jrelpath, jkind,
- jlong(replaces_rev)),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "addAbsent",
+ "(Ljava/lang/String;"
+ "L"JAVA_PACKAGE"/types/NodeKind;"
+ "J)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jkind = EnumMapper::mapNodeKind(kind);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jkind,
+ jlong(replaces_rev));
+ });
return SVN_NO_ERROR;
}
@@ -297,29 +307,32 @@ EditorProxy::cb_alter_directory(void *ba
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_alter_directory('%s', r%lld)\n",
//DEBUG: relpath, static_cast<long long>(revision));
-
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "alterDirectory",
- "(Ljava/lang/String;J"
- "Ljava/lang/Iterable;"
- "Ljava/util/Map;)V"));
-
- jstring jrelpath = JNIUtil::makeJString(relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jchildren = (!children ? NULL : CreateJ::StringSet(children));
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid,
- jrelpath, jlong(revision),
- jchildren, jprops),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "alterDirectory",
+ "(Ljava/lang/String;J"
+ "Ljava/lang/Iterable;"
+ "Ljava/util/Map;)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jchildren = (!children ? NULL : CreateJ::StringSet(children));
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jlong(revision),
+ jchildren, jprops);
+ });
return SVN_NO_ERROR;
}
@@ -334,36 +347,37 @@ EditorProxy::cb_alter_file(void *baton,
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_alter_file('%s', r%lld)\n",
//DEBUG: relpath, static_cast<long long>(revision));
-
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "alterFile",
- "(Ljava/lang/String;J"
- "L"JAVA_PACKAGE"/types/Checksum;"
- "Ljava/io/InputStream;"
- "Ljava/util/Map;)V"));
-
- jstring jrelpath = JNIUtil::makeJString(relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jchecksum = CreateJ::Checksum(checksum);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jcontents = NULL;
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
-
- if (contents != NULL)
- SVN_JAVAHL_CATCH(Java::Env(), SVN_ERR_RA_SVN_EDIT_ABORTED,
- jcontents = wrap_input_stream(contents));
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid,
- jrelpath, jlong(revision),
- jchecksum, jcontents, jprops),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "alterFile",
+ "(Ljava/lang/String;J"
+ "L"JAVA_PACKAGE"/types/Checksum;"
+ "Ljava/io/InputStream;"
+ "Ljava/util/Map;)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jchecksum = CreateJ::Checksum(checksum);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ jobject jcontents = NULL;
+ if (contents != NULL)
+ jcontents = wrap_input_stream(contents);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jlong(revision),
+ jchecksum, jcontents, jprops);
+ });
return SVN_NO_ERROR;
}
@@ -377,29 +391,32 @@ EditorProxy::cb_alter_symlink(void *bato
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_alter_symlink('%s', r%lld)\n",
//DEBUG: relpath, static_cast<long long>(revision));
-
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "alterSymlink",
- "(Ljava/lang/String;J"
- "Ljava/lang/String;"
- "Ljava/util/Map;)V"));
-
- jstring jrelpath = JNIUtil::makeJString(relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jstring jtarget = JNIUtil::makeJString(target);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid,
- jrelpath, jlong(revision),
- jtarget, jprops),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "alterSymlink",
+ "(Ljava/lang/String;J"
+ "Ljava/lang/String;"
+ "Ljava/util/Map;)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jstring jtarget = JNIUtil::makeJString(target);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jobject jprops = CreateJ::PropertyMap(props, scratch_pool);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jrelpath, jlong(revision),
+ jtarget, jprops);
+ });
return SVN_NO_ERROR;
}
@@ -411,21 +428,24 @@ EditorProxy::cb_delete(void *baton,
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_delete('%s', r%lld)\n",
//DEBUG: relpath, static_cast<long long>(revision));
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "delete",
+ "(Ljava/lang/String;J)V"));
+
+ jstring jrelpath = JNIUtil::makeJString(relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "delete",
- "(Ljava/lang/String;J)V"));
-
- jstring jrelpath = JNIUtil::makeJString(relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid, jrelpath),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ env.CallVoidMethod(ep->m_jeditor, mid, jrelpath);
+ });
return SVN_NO_ERROR;
}
@@ -439,26 +459,29 @@ EditorProxy::cb_copy(void *baton,
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_copy('%s', r%lld, '%s')\n",
//DEBUG: src_relpath, static_cast<long long>(src_revision), dst_relpath);
-
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "copy",
- "(Ljava/lang/String;J"
- "Ljava/lang/String;J)V"));
-
- jstring jsrc_relpath = JNIUtil::makeJString(src_relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jstring jdst_relpath = JNIUtil::makeJString(dst_relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid,
- jsrc_relpath, jlong(src_revision),
- jdst_relpath, jlong(replaces_rev)),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "copy",
+ "(Ljava/lang/String;J"
+ "Ljava/lang/String;J)V"));
+
+ jstring jsrc_relpath = JNIUtil::makeJString(src_relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jstring jdst_relpath = JNIUtil::makeJString(dst_relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jsrc_relpath, jlong(src_revision),
+ jdst_relpath, jlong(replaces_rev));
+ });
return SVN_NO_ERROR;
}
@@ -472,26 +495,29 @@ EditorProxy::cb_move(void *baton,
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_move('%s', r%lld, '%s')\n",
//DEBUG: src_relpath, static_cast<long long>(src_revision), dst_relpath);
-
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "move",
- "(Ljava/lang/String;J"
- "Ljava/lang/String;J)V"));
-
- jstring jsrc_relpath = JNIUtil::makeJString(src_relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
- jstring jdst_relpath = JNIUtil::makeJString(dst_relpath);
- SVN_JNI_CATCH(,SVN_ERR_RA_SVN_EDIT_ABORTED);
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid,
- jsrc_relpath, jlong(src_revision),
- jdst_relpath, jlong(replaces_rev)),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "move",
+ "(Ljava/lang/String;J"
+ "Ljava/lang/String;J)V"));
+
+ jstring jsrc_relpath = JNIUtil::makeJString(src_relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+ jstring jdst_relpath = JNIUtil::makeJString(dst_relpath);
+ SVN_JAVAHL_OLDSTYLE_EXCEPTION_CHECK(env);
+
+ env.CallVoidMethod(ep->m_jeditor, mid,
+ jsrc_relpath, jlong(src_revision),
+ jdst_relpath, jlong(replaces_rev));
+ });
return SVN_NO_ERROR;
}
@@ -499,18 +525,21 @@ svn_error_t*
EditorProxy::cb_complete(void *baton, apr_pool_t *scratch_pool)
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_complete()\n");
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+ ep->m_valid = false;
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "complete", "()V"));
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
- ep->m_valid = false;
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "complete", "()V"));
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ env.CallVoidMethod(ep->m_jeditor, mid);
+ });
return SVN_NO_ERROR;
}
@@ -518,17 +547,20 @@ svn_error_t*
EditorProxy::cb_abort(void *baton, apr_pool_t *scratch_pool)
{
//DEBUG:fprintf(stderr, " (n) EditorProxy::cb_abort()\n");
+ const ::Java::Env env;
+ SVN_JAVAHL_CATCH(env, SVN_ERR_RA_SVN_EDIT_ABORTED,
+ {
+ ::Java::LocalFrame frame(env);
+
+ EditorProxy* const ep = static_cast<EditorProxy*>(baton);
+ if (!ep || !ep->m_valid)
+ return invalid_editor();
+ ep->m_valid = false;
+
+ static jmethodID mid = 0;
+ SVN_ERR(get_editor_method(mid, "abort", "()V"));
- EditorProxy* const ep = static_cast<EditorProxy*>(baton);
- if (!ep || !ep->m_valid)
- return invalid_editor();
- ep->m_valid = false;
-
- static jmethodID mid = 0;
- SVN_ERR(get_editor_method(mid, "abort", "()V"));
-
- SVN_JNI_CATCH(
- JNIUtil::getEnv()->CallVoidMethod(ep->m_jeditor, mid),
- SVN_ERR_RA_SVN_EDIT_ABORTED);
+ env.CallVoidMethod(ep->m_jeditor, mid);
+ });
return SVN_NO_ERROR;
}
Modified: subversion/trunk/subversion/bindings/javahl/native/NativeStream.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/NativeStream.cpp?rev=1676564&r1=1676563&r2=1676564&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/NativeStream.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/NativeStream.cpp Tue Apr 28 15:26:27 2015
@@ -45,16 +45,23 @@ void NativeInputStream::set_stream(svn_s
}
NativeInputStream*
-NativeInputStream::get_self(::Java::Env env, jobject jthis)
+NativeInputStream::get_self_unsafe(::Java::Env env, jobject jthis)
{
jfieldID fid_cppaddr = NULL;
const jlong cppaddr =
findCppAddrForJObject(jthis, &fid_cppaddr, m_class_name);
- if (!cppaddr)
- ::Java::NullPointerException(env).raise(_("this [C++]"));
return reinterpret_cast<NativeInputStream*>(cppaddr);
}
+NativeInputStream*
+NativeInputStream::get_self(::Java::Env env, jobject jthis)
+{
+ NativeInputStream* self = get_self_unsafe(env, jthis);
+ if (!self)
+ ::Java::NullPointerException(env).raise(_("this [C++]"));
+ return self;
+}
+
void NativeInputStream::close(::Java::Env env, jobject jthis)
{
SVN_JAVAHL_CHECK(env, svn_stream_close(m_stream));
@@ -149,16 +156,23 @@ void NativeOutputStream::set_stream(svn_
}
NativeOutputStream*
-NativeOutputStream::get_self(::Java::Env env, jobject jthis)
+NativeOutputStream::get_self_unsafe(::Java::Env env, jobject jthis)
{
jfieldID fid_cppaddr = NULL;
const jlong cppaddr =
findCppAddrForJObject(jthis, &fid_cppaddr, m_class_name);
- if (!cppaddr)
- ::Java::NullPointerException(env).raise(_("this [C++]"));
return reinterpret_cast<NativeOutputStream*>(cppaddr);
}
+NativeOutputStream*
+NativeOutputStream::get_self(::Java::Env env, jobject jthis)
+{
+ NativeOutputStream* self = get_self_unsafe(env, jthis);
+ if (!self)
+ ::Java::NullPointerException(env).raise(_("this [C++]"));
+ return self;
+}
+
void NativeOutputStream::close(::Java::Env env, jobject jthis)
{
SVN_JAVAHL_CHECK(env, svn_stream_close(m_stream));
@@ -294,6 +308,20 @@ Java_org_apache_subversion_javahl_types_
return 0;
}
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_NativeInputStream_finalize(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(NativeInputStream, finalize)
+ {
+ JavaHL::NativeInputStream* native =
+ JavaHL::NativeInputStream::get_self_unsafe(Java::Env(jenv), jthis);
+ if (native != NULL)
+ native->finalize();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+}
+
// Class JavaHL::NativeOutputStream native method implementation
#include "../include/org_apache_subversion_javahl_types_NativeOutputStream.h"
@@ -337,3 +365,17 @@ Java_org_apache_subversion_javahl_types_
}
SVN_JAVAHL_JNI_CATCH_TO_EXCEPTION(Java::IOException);
}
+
+JNIEXPORT void JNICALL
+Java_org_apache_subversion_javahl_types_NativeOutputStream_finalize(
+ JNIEnv* jenv, jobject jthis)
+{
+ SVN_JAVAHL_JNI_TRY(NativeOutputStream, finalize)
+ {
+ JavaHL::NativeOutputStream* native =
+ JavaHL::NativeOutputStream::get_self_unsafe(Java::Env(jenv), jthis);
+ if (native != NULL)
+ native->finalize();
+ }
+ SVN_JAVAHL_JNI_CATCH;
+}
Modified: subversion/trunk/subversion/bindings/javahl/native/NativeStream.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/NativeStream.hpp?rev=1676564&r1=1676563&r2=1676564&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/NativeStream.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/NativeStream.hpp Tue Apr 28 15:26:27 2015
@@ -81,6 +81,8 @@ public:
*/
static NativeInputStream* get_self(::Java::Env env, jobject jthis);
+ static NativeInputStream* get_self_unsafe(::Java::Env env, jobject jthis);
+
public:
/**
* Implements @c InputStream.close().
@@ -176,6 +178,8 @@ public:
*/
static NativeOutputStream* get_self(::Java::Env env, jobject jthis);
+ static NativeOutputStream* get_self_unsafe(::Java::Env env, jobject jthis);
+
public:
/**
* Implements @c OutputStream.close().
Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java?rev=1676564&r1=1676563&r2=1676564&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java (original)
+++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/remote/StatusEditor.java Tue Apr 28 15:26:27 2015
@@ -79,10 +79,12 @@ class StatusEditor implements ISVNEditor
long replacesRevision)
{
//DEBUG:System.err.println(" [J] StatusEditor.addFile");
- try {
- contents.close();
- } catch (IOException ex) {
- throw new RuntimeException(ex);
+ if (contents != null) {
+ try {
+ contents.close();
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
}
checkState();