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 2014/06/26 11:27:21 UTC

svn commit: r1605718 - in /subversion/trunk/subversion/bindings/javahl/native: ./ jniwrapper/

Author: brane
Date: Thu Jun 26 09:27:21 2014
New Revision: 1605718

URL: http://svn.apache.org/r1605718
Log:
Fix the JavaHL class cache implementation to make the code re-entrant.

[in subversion/bindings/javahl/native]
* jniwrapper/jni_object.hpp (ClassCache::get_*):
   Change the factory methods to require a JNI environment parameter.
* jniwrapper/jni_class_cache.cpp
  (ClassCacheImpl::m_env): Remove cached JNI environment.
  (ClassCacheImpl::static_init): Require a JNI environment parameter.
  (ClassCacheImpl::get_*): Likewise.
  (ClassCache::get_*): Update; forward JNI environment to ClassCacheImpl.

* jniwrapper/jni_string_map.hpp
  (BaseMap::Set::impl, BaseMap::Iterator::impl, BaseMap::Entry::impl):
   Require a JNI environment parameter and forward it to the
   ClassCache factory methods.

* AuthnCallback.hpp, AuthnCallback.cpp,
  Credential.hpp, Credential.cpp, EditorCallbacks.hpp,
  ExternalItem.cpp, Prompter.cpp, SubversionException.hpp
  jniwrapper/jni_base.cpp, jniwrapper/jni_channel.hpp,
  jniwrapper/jni_channel.cpp, jniwrapper/jni_io_stream.hpp,
  jniwrapper/jni_list.hpp, jniwrapper/jni_list.cpp,
  jniwrapper/jni_string_map.hpp, jniwrapper/jni_string_map.cpp:
   Update all uses of ClassCache and the static impl factories
   to forward the JNI environment that's already available from
   the Java native method implementations.

Modified:
    subversion/trunk/subversion/bindings/javahl/native/AuthnCallback.cpp
    subversion/trunk/subversion/bindings/javahl/native/AuthnCallback.hpp
    subversion/trunk/subversion/bindings/javahl/native/Credential.cpp
    subversion/trunk/subversion/bindings/javahl/native/Credential.hpp
    subversion/trunk/subversion/bindings/javahl/native/EditorCallbacks.hpp
    subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp
    subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp
    subversion/trunk/subversion/bindings/javahl/native/SubversionException.hpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp
    subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp

Modified: subversion/trunk/subversion/bindings/javahl/native/AuthnCallback.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/AuthnCallback.cpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/AuthnCallback.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/AuthnCallback.cpp Thu Jun 26 09:27:21 2014
@@ -161,7 +161,7 @@ AuthnCallback::SSLServerCertFailures::Cl
 AuthnCallback::SSLServerCertFailures::SSLServerCertFailures(
     ::Java::Env env, jint failures)
   : ::Java::Object(env,
-                   ::Java::ClassCache::get_authn_ssl_server_cert_failures())
+                   ::Java::ClassCache::get_authn_ssl_server_cert_failures(env))
 {
   set_this(env.NewObject(get_class(), impl().m_mid_ctor, failures));
 }
@@ -194,7 +194,7 @@ AuthnCallback::SSLServerCertInfo::SSLSer
     const ::Java::String& issuer,
     const ::Java::String& der)
   : ::Java::Object(env,
-                   ::Java::ClassCache::get_authn_ssl_server_cert_info())
+                   ::Java::ClassCache::get_authn_ssl_server_cert_info(env))
 {
   set_this(env.NewObject(get_class(), impl().m_mid_ctor,
                          hostname.get(), fingerprint.get(),

Modified: subversion/trunk/subversion/bindings/javahl/native/AuthnCallback.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/AuthnCallback.hpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/AuthnCallback.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/AuthnCallback.hpp Thu Jun 26 09:27:21 2014
@@ -52,7 +52,7 @@ public:
      * The constructor does not verify the class of the wrapped object.
      */
     explicit AuthnResult(::Java::Env env, jobject jthis)
-      : ::Java::Object(env, ::Java::ClassCache::get_authn_result(), jthis)
+      : ::Java::Object(env, ::Java::ClassCache::get_authn_result(env), jthis)
       {}
 
     bool save() const
@@ -193,7 +193,7 @@ public:
    * The constructor does not verify the class of the wrapped object.
    */
   explicit AuthnCallback(::Java::Env env, jobject jthis)
-    : ::Java::Object(env, ::Java::ClassCache::get_authn_cb(), jthis)
+    : ::Java::Object(env, ::Java::ClassCache::get_authn_cb(env), jthis)
     {}
 
   /**
@@ -285,7 +285,7 @@ public:
    * The constructor does not verify the class of the wrapped object.
    */
   explicit UserPasswordCallback(::Java::Env env, jobject jthis)
-    : ::Java::Object(env, ::Java::ClassCache::get_user_passwd_cb(), jthis)
+    : ::Java::Object(env, ::Java::ClassCache::get_user_passwd_cb(env), jthis)
     {}
 
   /**

Modified: subversion/trunk/subversion/bindings/javahl/native/Credential.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/Credential.cpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/Credential.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/Credential.cpp Thu Jun 26 09:27:21 2014
@@ -52,7 +52,7 @@ Credential::Credential(::Java::Env env, 
                        const ::Java::String& password,
                        jobject info, jobject failures,
                        const ::Java::String& passphrase)
-  : ::Java::Object(env, ::Java::ClassCache::get_credential())
+  : ::Java::Object(env, ::Java::ClassCache::get_credential(env))
 {
   set_this(env.NewObject(get_class(), impl().m_mid_ctor,
                          kind, realm.get(), store.get(),
@@ -76,7 +76,7 @@ Credential::Kind::ClassImpl::~ClassImpl(
 
 Credential::Kind::Kind(::Java::Env env,
                        const ::Java::String& value)
-  : ::Java::Object(env, ::Java::ClassCache::get_credential_kind())
+  : ::Java::Object(env, ::Java::ClassCache::get_credential_kind(env))
 {
   set_this(env.CallStaticObjectMethod(
                get_class(), impl().m_static_mid_from_string, value.get()));

Modified: subversion/trunk/subversion/bindings/javahl/native/Credential.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/Credential.hpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/Credential.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/Credential.hpp Thu Jun 26 09:27:21 2014
@@ -81,7 +81,7 @@ public:
    * The constructor does not verify the class of the wrapped object.
    */
   explicit Credential(::Java::Env env, jobject jthis)
-    : ::Java::Object(env, ::Java::ClassCache::get_credential(), jthis)
+    : ::Java::Object(env, ::Java::ClassCache::get_credential(env), jthis)
     {}
 
   /**

Modified: subversion/trunk/subversion/bindings/javahl/native/EditorCallbacks.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/EditorCallbacks.hpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/EditorCallbacks.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/EditorCallbacks.hpp Thu Jun 26 09:27:21 2014
@@ -47,7 +47,7 @@ public:
    */
   explicit ProvideBaseCallback(::Java::Env env, jobject jthis)
     : ::Java::Object(env,
-                     ::Java::ClassCache::get_editor_provide_base_cb(),
+                     ::Java::ClassCache::get_editor_provide_base_cb(env),
                      jthis)
     {}
 
@@ -69,7 +69,7 @@ public:
      */
     explicit ReturnValue(::Java::Env env, jobject jthis)
       : Java::Object(env,
-                     ::Java::ClassCache::get_editor_provide_base_cb_ret(),
+                     ::Java::ClassCache::get_editor_provide_base_cb_ret(env),
                      jthis)
       {}
 
@@ -167,7 +167,7 @@ public:
    */
   explicit ProvidePropsCallback(::Java::Env env, jobject jthis)
     : ::Java::Object(env,
-                     ::Java::ClassCache::get_editor_provide_props_cb(),
+                     ::Java::ClassCache::get_editor_provide_props_cb(env),
                      jthis)
     {}
 
@@ -188,7 +188,7 @@ public:
      */
     explicit ReturnValue(::Java::Env env, jobject jthis)
       : Java::Object(env,
-                     ::Java::ClassCache::get_editor_provide_props_cb_ret(),
+                     ::Java::ClassCache::get_editor_provide_props_cb_ret(env),
                      jthis)
       {}
 
@@ -284,7 +284,7 @@ public:
    */
   explicit GetNodeKindCallback(::Java::Env env, jobject jthis)
     : ::Java::Object(env,
-                     ::Java::ClassCache::get_editor_get_kind_cb(),
+                     ::Java::ClassCache::get_editor_get_kind_cb(env),
                      jthis)
     {}
 

Modified: subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/ExternalItem.cpp Thu Jun 26 09:27:21 2014
@@ -82,7 +82,7 @@ make_external_item(::Java::Env env,
 } // anonymous namespace
 
 ExternalItem::ExternalItem(::Java::Env env, jobject jthis)
-  : Object(env, ::Java::ClassCache::get_external_item(), jthis),
+  : Object(env, ::Java::ClassCache::get_external_item(env), jthis),
     m_target_dir(env, get_string_field(env, jthis, impl().m_fid_target_dir)),
     m_url(env, get_string_field(env, jthis, impl().m_fid_url)),
     m_revision(get_revision_field(env, jthis, impl().m_fid_revision)),
@@ -94,7 +94,7 @@ ExternalItem::ExternalItem(::Java::Env e
                            const char* url,
                            const svn_opt_revision_t* revision,
                            const svn_opt_revision_t* peg_revision)
-  : Object(env, ::Java::ClassCache::get_external_item()),
+  : Object(env, ::Java::ClassCache::get_external_item(env)),
     m_target_dir(env, target_dir),
     m_url(env, url),
     m_revision(*revision),

Modified: subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/Prompter.cpp Thu Jun 26 09:27:21 2014
@@ -51,7 +51,7 @@ Prompter::UniquePtr Prompter::create(job
   const ::Java::Env jenv;
   try
     {
-      const jclass cls = ::Java::ClassCache::get_authn_cb()->get_class();
+      const jclass cls = ::Java::ClassCache::get_authn_cb(jenv)->get_class();
       if (!jenv.IsInstanceOf(jprompter, cls))
         return UniquePtr(NULL);
 
@@ -445,7 +445,8 @@ Prompter::UniquePtr CompatPrompter::crea
   const ::Java::Env jenv;
   try
     {
-      const jclass cls = ::Java::ClassCache::get_user_passwd_cb()->get_class();
+      const jclass cls =
+        ::Java::ClassCache::get_user_passwd_cb(jenv)->get_class();
       if (!jenv.IsInstanceOf(jprompter, cls))
         return UniquePtr(NULL);
 

Modified: subversion/trunk/subversion/bindings/javahl/native/SubversionException.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/SubversionException.hpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/SubversionException.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/SubversionException.hpp Thu Jun 26 09:27:21 2014
@@ -41,7 +41,7 @@ class SubversionException : public ::Jav
 {
 public:
   explicit SubversionException(::Java::Env env)
-    : Java::Exception(env, ::Java::ClassCache::get_subversion_exception())
+    : Java::Exception(env, ::Java::ClassCache::get_subversion_exception(env))
     {}
 
 private:

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_base.cpp Thu Jun 26 09:27:21 2014
@@ -220,7 +220,7 @@ MethodID Class::m_mid_get_name;
 void Class::static_init(Env env, jclass cls)
 {
   m_mid_get_class = env.GetMethodID(
-      ClassCache::get_object()->get_class(),
+      ClassCache::get_object(env)->get_class(),
       "getClass", "()Ljava/lang/Class;");
   m_mid_get_name = env.GetMethodID(
       cls, "getName",  "()Ljava/lang/String;");
@@ -343,7 +343,7 @@ void handle_svn_error(Env env, ::svn_err
     {
       cause = env.ExceptionOccurred();
       if (env.IsInstanceOf(
-              cause, ClassCache::get_subversion_exception()->get_class()))
+              cause, ClassCache::get_subversion_exception(env)->get_class()))
         {
           // XXX FIXME: Should really have a special error code
           // specifically for propagating Java exceptions from

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_channel.cpp Thu Jun 26 09:27:21 2014
@@ -135,7 +135,7 @@ ByteChannel::ByteBuffer::ClassImpl::~Cla
 
 jint ByteChannel::read(jobject destination)
 {
-  const ByteBuffer::ClassImpl& bufimpl = ByteBuffer::impl();
+  const ByteBuffer::ClassImpl& bufimpl = ByteBuffer::impl(m_env);
 
   const jint remaining = get_remaining(m_env, destination,
                                        bufimpl.m_mid_get_remaining);
@@ -196,7 +196,7 @@ jint ByteChannel::read(jobject destinati
 
 jint ByteChannel::write(jobject source)
 {
-  const ByteBuffer::ClassImpl& bufimpl = ByteBuffer::impl();
+  const ByteBuffer::ClassImpl& bufimpl = ByteBuffer::impl(m_env);
 
   const jint remaining = get_remaining(m_env, source,
                                        bufimpl.m_mid_get_remaining);

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_channel.hpp Thu Jun 26 09:27:21 2014
@@ -154,9 +154,10 @@ private:
     };
 
     static const char* const m_class_name;
-    static const ClassImpl& impl()
+    static const ClassImpl& impl(Env env)
       {
-        return *dynamic_cast<const ClassImpl*>(ClassCache::get_byte_buffer());
+        return *dynamic_cast<const ClassImpl*>(
+            ClassCache::get_byte_buffer(env));
       }
   };
 };

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_class_cache.cpp Thu Jun 26 09:27:21 2014
@@ -101,11 +101,9 @@ class ClassCacheImpl
 {
 
   friend class ClassCache;
-  const Env m_env;
 
   // We only statically initialize a few of the common class wrappers.
-  explicit ClassCacheImpl(Env env)
-    : m_env(env),
+  explicit ClassCacheImpl(Env env) :
 
 #define JNIWRAPPER_INIT_CACHED_CLASS(M, C)     \
   m_impl_##M(new C::ClassImpl(env, env.FindClass(C::m_class_name)))
@@ -120,10 +118,10 @@ class ClassCacheImpl
   // We can't do this in the constructor above, because the satic
   // initializers will expect that ClassCache::m_impl is already set;
   // that doesn't happen until the constructor returns.
-  void static_init()
+  void static_init(Env env)
     {
-#define JNIWRAPPER_STATIC_CACHED_CLASS(M, C)     \
-      C::static_init(m_env, m_impl_##M->get_class())
+#define JNIWRAPPER_STATIC_CACHED_CLASS(M, C)            \
+      C::static_init(env, m_impl_##M->get_class())
 
       // No-op JNIWRAPPER_STATIC_CACHED_CLASS(object, Object);
       JNIWRAPPER_STATIC_CACHED_CLASS(classtype, Class);
@@ -136,7 +134,7 @@ class ClassCacheImpl
   // therefore do not need atomic access.
 #define JNIWRAPPER_DEFINE_CACHED_CLASS(M, C)            \
   std::auto_ptr<Object::ClassImpl> m_impl_##M;          \
-  const Object::ClassImpl* get_##M()                    \
+  const Object::ClassImpl* get_##M(Env)                 \
     {                                                   \
       return m_impl_##M.get();                          \
     }
@@ -150,14 +148,14 @@ class ClassCacheImpl
   // All other class wrappers must be atomically initialized
 #define JNIWRAPPER_DEFINE_CACHED_CLASS(M, C)                    \
   ClassImplPtr m_impl_##M;                                      \
-  const Object::ClassImpl* get_##M()                            \
+  const Object::ClassImpl* get_##M(Env env)                     \
     {                                                           \
       Object::ClassImpl* pimpl = m_impl_##M.get();              \
       if (!pimpl)                                               \
         {                                                       \
           std::auto_ptr<Object::ClassImpl> tmp(                 \
               new C::ClassImpl(                                 \
-                  m_env, m_env.FindClass(C::m_class_name)));    \
+                  env, env.FindClass(C::m_class_name)));        \
           pimpl = m_impl_##M.test_and_set(tmp.get());           \
           if (!pimpl)                                           \
             pimpl = tmp.release();                              \
@@ -224,8 +222,9 @@ void ClassCache::create()
 
   try
     {
-      m_impl = new ClassCacheImpl(Env());
-      m_impl->static_init();
+      const Env env;
+      m_impl = new ClassCacheImpl(env);
+      m_impl->static_init(env);
     }
   catch (const SignalExceptionThrown&)
     {}
@@ -270,9 +269,9 @@ void ClassCache::destroy()
 }
 
 #define JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(M)         \
-const Object::ClassImpl* ClassCache::get_##M()          \
+const Object::ClassImpl* ClassCache::get_##M(Env env)   \
 {                                                       \
-  return m_impl->get_##M();                             \
+  return m_impl->get_##M(env);                          \
 }
 
 JNIWRAPPER_IMPL_CLASS_CACHE_ACCESSOR(object);

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_io_stream.hpp Thu Jun 26 09:27:21 2014
@@ -49,7 +49,7 @@ public:
    * Constructs a wrapper around an existing @c InputStream @a jstream.
    */
   explicit InputStream(Env env, jobject jstream)
-    : Object(env, ClassCache::get_input_stream(), jstream)
+    : Object(env, ClassCache::get_input_stream(env), jstream)
     {}
 
   /**
@@ -177,7 +177,7 @@ public:
    * Constructs a wrapper around an existing @c OutputStream @a jstream.
    */
   explicit OutputStream(Env env, jobject jstream)
-    : Object(env, ClassCache::get_output_stream(), jstream)
+    : Object(env, ClassCache::get_output_stream(env), jstream)
     {}
 
   /**

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.cpp Thu Jun 26 09:27:21 2014
@@ -40,7 +40,8 @@ BaseList::ClassImpl::~ClassImpl() {}
 BaseList::ovector
 BaseList::convert_to_vector(Env env, jobject jlist)
 {
-  const ClassImpl* pimpl = dynamic_cast<const ClassImpl*>(ClassCache::get_list());
+  const ClassImpl* pimpl =
+    dynamic_cast<const ClassImpl*>(ClassCache::get_list(env));
   const jint length = env.CallIntMethod(jlist, pimpl->m_mid_size);
 
   if (!length)

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_list.hpp Thu Jun 26 09:27:21 2014
@@ -58,7 +58,7 @@ protected:
    * @c std::vector.
    */
   explicit BaseList(Env env, jobject jlist)
-    : Object(env, ClassCache::get_list(), jlist),
+    : Object(env, ClassCache::get_list(env), jlist),
       m_contents(convert_to_vector(env, m_jthis))
     {}
 
@@ -197,7 +197,7 @@ protected:
    * Constructs the list wrapper, deriving the class from @a jlist.
    */
   explicit BaseMutableList(Env env, jobject jlist)
-    : Object(env, ClassCache::get_array_list(), jlist)
+    : Object(env, ClassCache::get_array_list(env), jlist)
     {}
 
   /**
@@ -205,7 +205,7 @@ protected:
    * with initial allocation size @a length.
    */
   explicit BaseMutableList(Env env, jint length)
-    : Object(env, ClassCache::get_array_list())
+    : Object(env, ClassCache::get_array_list(env))
     {
       set_this(env.NewObject(get_class(), impl().m_mid_ctor, length));
     }

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_object.hpp Thu Jun 26 09:27:21 2014
@@ -164,7 +164,7 @@ public:
   static void destroy();
 
 #define JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(M)     \
-  static const Object::ClassImpl* get_##M();
+  static const Object::ClassImpl* get_##M(Env env);
 
   JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(object);
   JNIWRAPPER_DECLARE_CACHED_CLASS_ACCESSOR(classtype);

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_string_map.cpp Thu Jun 26 09:27:21 2014
@@ -87,7 +87,8 @@ jobject BaseMap::operator[](const std::s
 
 BaseMap::somap BaseMap::convert_to_map(Env env, jobject jmap)
 {
-  const ClassImpl* pimpl = dynamic_cast<const ClassImpl*>(ClassCache::get_map());
+  const ClassImpl* pimpl =
+    dynamic_cast<const ClassImpl*>(ClassCache::get_map(env));
 
   if (!env.CallIntMethod(jmap, pimpl->m_mid_size))
     return somap();
@@ -95,10 +96,10 @@ BaseMap::somap BaseMap::convert_to_map(E
   // Get an iterator over the map's entry set
   const jobject entries = env.CallObjectMethod(jmap, pimpl->m_mid_entry_set);
   const jobject iterator = env.CallObjectMethod(entries,
-                                                Set::impl().m_mid_iterator);
+                                                Set::impl(env).m_mid_iterator);
 
-  const Iterator::ClassImpl& iterimpl = Iterator::impl();
-  const Entry::ClassImpl& entimpl = Entry::impl();
+  const Iterator::ClassImpl& iterimpl = Iterator::impl(env);
+  const Entry::ClassImpl& entimpl = Entry::impl(env);
 
   // Yterate over the map, filling the native map
   somap contents;

Modified: subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp?rev=1605718&r1=1605717&r2=1605718&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp (original)
+++ subversion/trunk/subversion/bindings/javahl/native/jniwrapper/jni_string_map.hpp Thu Jun 26 09:27:21 2014
@@ -59,7 +59,7 @@ protected:
    * @c std::map.
    */
   explicit BaseMap(Env env, jobject jmap)
-    : Object(env, ClassCache::get_map(), jmap),
+    : Object(env, ClassCache::get_map(env), jmap),
       m_contents(convert_to_map(env, m_jthis))
     {}
 
@@ -117,9 +117,9 @@ private:
     };
 
     static const char* const m_class_name;
-    static const ClassImpl& impl()
+    static const ClassImpl& impl(Env env)
       {
-        return *dynamic_cast<const ClassImpl*>(ClassCache::get_set());
+        return *dynamic_cast<const ClassImpl*>(ClassCache::get_set(env));
       }
   };
 
@@ -143,9 +143,9 @@ private:
     };
 
     static const char* const m_class_name;
-    static const ClassImpl& impl()
+    static const ClassImpl& impl(Env env)
       {
-        return *dynamic_cast<const ClassImpl*>(ClassCache::get_iterator());
+        return *dynamic_cast<const ClassImpl*>(ClassCache::get_iterator(env));
       }
   };
 
@@ -169,9 +169,9 @@ private:
     };
 
     static const char* const m_class_name;
-    static const ClassImpl& impl()
+    static const ClassImpl& impl(Env env)
       {
-        return *dynamic_cast<const ClassImpl*>(ClassCache::get_map_entry());
+        return *dynamic_cast<const ClassImpl*>(ClassCache::get_map_entry(env));
       }
   };
 };
@@ -277,7 +277,7 @@ protected:
    * Constructs the map wrapper, deriving the class from @a jmap.
    */
   explicit BaseMutableMap(Env env, jobject jmap)
-    : Object(env, ClassCache::get_hash_map(), jmap)
+    : Object(env, ClassCache::get_hash_map(env), jmap)
     {}
 
   /**
@@ -285,7 +285,7 @@ protected:
    * with initial allocation size @a length.
    */
   explicit BaseMutableMap(Env env, jint length)
-    : Object(env, ClassCache::get_hash_map())
+    : Object(env, ClassCache::get_hash_map(env))
     {
       set_this(env.NewObject(get_class(), impl().m_mid_ctor, length));
     }