Skip to content

Commit

Permalink
Moves cache implementation into cpp (#1576)
Browse files Browse the repository at this point in the history
Signed-off-by: Yauheni Khnykin <[email protected]>
  • Loading branch information
Hsilgos authored Apr 15, 2024
1 parent 9bd08b6 commit 0845616
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,6 @@

#include "JniReference.h"

#include <memory>
#include <mutex>
#include <unordered_map>

{{#internalNamespace}}
namespace {{.}}
{
Expand All @@ -39,44 +35,27 @@ class JNIEXPORT JniWrapperCache
{
public:
template<class T>
static void cache_wrapper(JNIEnv* jenv, std::shared_ptr<T> nobj, const JniReference<jobject>& jobj) {
std::lock_guard<std::mutex> lock(s_mutex);
s_wrapper_cache[nobj.get()] = jenv->NewWeakGlobalRef(jobj.get());
static void cache_wrapper(JNIEnv* jenv, const std::shared_ptr<T>& nobj, const JniReference<jobject>& jobj) {
cache_wrapper_impl(jenv, nobj.get(), jobj);
}

template<class T>
static JniReference<jobject> get_cached_wrapper(JNIEnv* jenv, std::shared_ptr<T> nobj) {
std::lock_guard<std::mutex> lock(s_mutex);
auto iter = s_wrapper_cache.find(nobj.get());
if (iter == s_wrapper_cache.end()) return {};

auto jobj = jenv->NewLocalRef(iter->second);
if (jenv->IsSameObject(jobj, NULL)) {
jenv->DeleteLocalRef(jobj);
return {};
} else {
return make_local_ref(jenv, jobj);
}
static JniReference<jobject> get_cached_wrapper(JNIEnv* jenv, const std::shared_ptr<T>& nobj) {
return get_cached_wrapper_impl(jenv, nobj.get());
}

template<class T>
static void remove_cached_wrapper(JNIEnv* jenv, std::shared_ptr<T> nobj) {
std::lock_guard<std::mutex> lock(s_mutex);
auto iter = s_wrapper_cache.find(nobj.get());
if (iter == s_wrapper_cache.end()) return;
jenv->DeleteWeakGlobalRef(iter->second);
s_wrapper_cache.erase(iter);
static void remove_cached_wrapper(JNIEnv* jenv, const std::shared_ptr<T>& nobj) {
remove_cached_wrapper_impl(jenv, nobj.get());
}

private:
static std::mutex s_mutex;
static std::unordered_map<const void*, jobject> s_wrapper_cache;
static void cache_wrapper_impl(JNIEnv* jenv, const void* obj_ptr, const JniReference<jobject>& jobj);
static JniReference<jobject> get_cached_wrapper_impl(JNIEnv* jenv, const void* obj_ptr);
static void remove_cached_wrapper_impl(JNIEnv* jenv, const void* obj_ptr);
};

}
} // namespace jni
{{#internalNamespace}}
}
} // namespace {{.}}
{{/internalNamespace}}
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,51 @@

#include "JniWrapperCache.h"

#include <mutex>
#include <unordered_map>

{{#internalNamespace}}
namespace {{.}}
{
{{/internalNamespace}}
namespace jni
{
std::mutex JniWrapperCache::s_mutex{};
std::unordered_map<const void*, jobject> JniWrapperCache::s_wrapper_cache{};
static std::mutex s_mutex;
static std::unordered_map<const void*, jobject> s_wrapper_cache;
void JniWrapperCache::cache_wrapper_impl(JNIEnv* jenv, const void* obj_ptr, const JniReference<jobject>& jobj) {
std::lock_guard<std::mutex> lock(s_mutex);
s_wrapper_cache[obj_ptr] = jenv->NewWeakGlobalRef(jobj.get());
}
{{#internalNamespace}}

JniReference<jobject> JniWrapperCache::get_cached_wrapper_impl(JNIEnv* jenv, const void* obj_ptr) {
std::lock_guard<std::mutex> lock(s_mutex);
auto iter = s_wrapper_cache.find(obj_ptr);
if (iter == s_wrapper_cache.end())
return {};

auto jobj = jenv->NewLocalRef(iter->second);
if (jenv->IsSameObject(jobj, NULL)) {
jenv->DeleteLocalRef(jobj);
return {};
} else {
return make_local_ref(jenv, jobj);
}
}

void JniWrapperCache::remove_cached_wrapper_impl(JNIEnv* jenv, const void* obj_ptr) {
std::lock_guard<std::mutex> lock(s_mutex);
auto iter = s_wrapper_cache.find(obj_ptr);
if (iter != s_wrapper_cache.end()) {
jenv->DeleteWeakGlobalRef(iter->second);
s_wrapper_cache.erase(iter);
}
}

} // namespace jni
{{#internalNamespace}}
} // namespace {{.}}
{{/internalNamespace}}

0 comments on commit 0845616

Please sign in to comment.