Author: brane
Date: Wed Jan 15 16:43:49 2014
New Revision: 1558458
URL: http://svn.apache.org/r1558458
Log:
On the javahl-1.8-extensions branch: Synced JavaHL from trunk up to r1558456.
Modified:
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/
(props changed)
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/JNIUtil.cpp
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/RemoteSession.cpp
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/StateReporter.cpp
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
Propchange:
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/
------------------------------------------------------------------------------
Merged /subversion/trunk/subversion/bindings/javahl:r1558016-1558456
Modified:
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/JNIUtil.cpp
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/JNIUtil.cpp?rev=1558458&r1=1558457&r2=1558458&view=diff
==============================================================================
---
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/JNIUtil.cpp
(original)
+++
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/JNIUtil.cpp
Wed Jan 15 16:43:49 2014
@@ -158,8 +158,19 @@ bool JNIUtil::JNIGlobalInit(JNIEnv *env)
}
svn_utf_initialize2(FALSE, g_pool); /* Optimize character conversions */
- svn_fs_initialize(g_pool); /* Avoid some theoretical issues */
- svn_ra_initialize(g_pool);
+
+ // Initialize the libraries we use
+ err = svn_fs_initialize(g_pool);
+ if (!err)
+ err = svn_ra_initialize(g_pool);
+ if (err)
+ {
+ if (stderr && err->message)
+ fprintf(stderr, "%s", err->message);
+
+ svn_error_clear(err);
+ return FALSE;
+ }
/* We shouldn't fill the JVMs memory with FS cache data unless
explictly requested. And we don't either, because the caches get
Modified:
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/RemoteSession.cpp
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/RemoteSession.cpp?rev=1558458&r1=1558457&r2=1558458&view=diff
==============================================================================
---
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/RemoteSession.cpp
(original)
+++
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/RemoteSession.cpp
Wed Jan 15 16:43:49 2014
@@ -128,16 +128,6 @@ RemoteSession::open(jint jretryAttempts,
const char* usernameStr, const char* passwordStr,
Prompter*& prompter, jobject jprogress, jobject jcfgcb)
{
- /*
- * Initialize ra layer if we have not done so yet
- */
- static bool initialized = false;
- if (!initialized)
- {
- SVN_JNI_ERR(svn_ra_initialize(JNIUtil::getPool()), NULL);
- initialized = true;
- }
-
RemoteSession* session = new RemoteSession(
jretryAttempts, url, uuid, configDirectory,
usernameStr, passwordStr, prompter, jcfgcb);
Modified:
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/StateReporter.cpp
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/StateReporter.cpp?rev=1558458&r1=1558457&r2=1558458&view=diff
==============================================================================
---
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/StateReporter.cpp
(original)
+++
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/native/StateReporter.cpp
Wed Jan 15 16:43:49 2014
@@ -160,6 +160,7 @@ StateReporter::finishReport()
SVN_JNI_ERR(m_raw_reporter->finish_report(m_report_baton,
subPool.getPool()),
SVN_INVALID_REVNUM);
+ m_valid = false;
return jlong(m_target_revision);
}
@@ -173,6 +174,7 @@ StateReporter::abortReport()
SVN::Pool subPool(pool);
SVN_JNI_ERR(m_raw_reporter->abort_report(m_report_baton,
subPool.getPool()),);
+ m_valid = false;
}
void
Modified:
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
URL:
http://svn.apache.org/viewvc/subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java?rev=1558458&r1=1558457&r2=1558458&view=diff
==============================================================================
---
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
(original)
+++
subversion/branches/javahl-1.8-extensions/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
Wed Jan 15 16:43:49 2014
@@ -1139,6 +1139,7 @@ public class SVNRemoteTests extends SVNT
rp.dispose();
}
assertEquals(21, receiver.status.size());
+ session.checkPath("", Revision.SVN_INVALID_REVNUM);
}
public void testTextchangeStatus() throws Exception
@@ -1354,4 +1355,43 @@ public class SVNRemoteTests extends SVNT
assertEquals("/iota", rev.getPath());
assertFalse(rev.isResultOfMerge());
}
+
+ // This test is a result of a threading bug that was identified in
+ // serf-1.3.2 and earlier. The net result was that opening two RA
+ // sessions to an https:// URL in two parallel threads would cause
+ // a crash in serf, due to the OpenSSL library not being
+ // initialized in a single-threaded context.
+ //
+ // The problem does not appear to exist with other RA methods, but
+ // the test is here just in case someone is actually pedantic
+ // enough to test JavaHL with an HTTPS setup.
+ public void testParallelOpen() throws Exception
+ {
+ final Runnable runnable = new Runnable() {
+ @Override
+ public void run() {
+ ISVNRemote session = null;
+ try {
+ session = getSession();
+ assertEquals(1, session.getLatestRevision());
+ }
+ catch (ClientException ex) {
+ throw new RuntimeException(ex);
+ }
+ finally {
+ if (session != null)
+ session.dispose();
+ }
+ }
+ };
+
+ Thread thread1 = new Thread(runnable);
+ Thread thread2 = new Thread(runnable);
+
+ thread1.start();
+ thread2.start();
+
+ thread1.join();
+ thread2.join();
+ }
}