From d020c79c03bbb9255de311a0927cb829899b29f8 Mon Sep 17 00:00:00 2001 From: heck Date: Mon, 20 Apr 2020 15:42:54 +0200 Subject: [PATCH] Replaced hashCode() with UniquelyIdentifiable.getId() java.lang.Object.hashCode() returns non unique numbers. --- .../pEp/jniadapter/AbstractEngine.java | 2 +- .../pEp/jniadapter/UniquelyIdentifiable.java | 11 +++++++ src/jniutils.cc | 32 +++++++++---------- src/jniutils.hh | 2 +- .../pEp/jniadapter/test/jni92/TestMain.java | 14 +++++--- 5 files changed, 39 insertions(+), 22 deletions(-) create mode 100644 src/foundation/pEp/jniadapter/UniquelyIdentifiable.java diff --git a/src/foundation/pEp/jniadapter/AbstractEngine.java b/src/foundation/pEp/jniadapter/AbstractEngine.java index 0550aaa..f882fce 100644 --- a/src/foundation/pEp/jniadapter/AbstractEngine.java +++ b/src/foundation/pEp/jniadapter/AbstractEngine.java @@ -8,7 +8,7 @@ import foundation.pEp.jniadapter.Sync.DefaultCallback; import java.io.UnsupportedEncodingException; import java.text.Normalizer; -abstract class AbstractEngine implements AutoCloseable { +abstract class AbstractEngine extends UniquelyIdentifiable implements AutoCloseable { static { System.loadLibrary("pEpJNI"); } diff --git a/src/foundation/pEp/jniadapter/UniquelyIdentifiable.java b/src/foundation/pEp/jniadapter/UniquelyIdentifiable.java new file mode 100644 index 0000000..d599e9c --- /dev/null +++ b/src/foundation/pEp/jniadapter/UniquelyIdentifiable.java @@ -0,0 +1,11 @@ +package foundation.pEp.jniadapter; +import java.util.concurrent.atomic.AtomicLong; + +abstract class UniquelyIdentifiable { + static final AtomicLong NEXT_ID = new AtomicLong(1); + final long id = NEXT_ID.getAndIncrement(); + + public long getId() { + return id; + } +} diff --git a/src/jniutils.cc b/src/jniutils.cc index 654ba8b..0ca7b4d 100644 --- a/src/jniutils.cc +++ b/src/jniutils.cc @@ -12,17 +12,17 @@ namespace pEp { namespace JNIAdapter { std::mutex global_mutex; - std::unordered_map engine_objhash_mutex; + std::unordered_map engine_objid_mutex; std::mutex* get_engine_java_object_mutex( JNIEnv *env, jobject obj ) { - int engine_obj_hash = (int)callIntMethod(env, obj, "hashCode"); - assert(engine_obj_hash); - std::mutex *engine_obj_mutex = engine_objhash_mutex.at(engine_obj_hash); - pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object hash: " << engine_obj_hash); + long engine_obj_id = (long)callLongMethod(env, obj, "getId"); + assert(engine_obj_id); + std::mutex *engine_obj_mutex = engine_objid_mutex.at(engine_obj_id); + pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object id: " << engine_obj_id); assert(engine_obj_mutex); return engine_obj_mutex; } @@ -32,16 +32,16 @@ namespace pEp { jobject obj ) { - int engine_obj_hash = (int)callIntMethod(env, obj, "hashCode"); - assert(engine_obj_hash); + long engine_obj_id = (long)callLongMethod(env, obj, "getId"); + assert(engine_obj_id); std::mutex *engine_obj_mutex = new std::mutex(); - pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object hash: " << engine_obj_hash); + pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object id: " << engine_obj_id); assert(engine_obj_mutex); - if(get_engine_java_object_mutex(env, obj) != nullptr ) { - pEpLog("Fatal: mutex already existing for this object"); + if(engine_objid_mutex.count(engine_obj_id) > 0) { + pEpLog("Fatal: mutex already existing for object id: " << engine_obj_id); assert(0); } - engine_objhash_mutex.insert(std::make_pair(engine_obj_hash, engine_obj_mutex )); + engine_objid_mutex.insert(std::make_pair(engine_obj_id, engine_obj_mutex )); } void release_engine_java_object_mutex( @@ -49,12 +49,12 @@ namespace pEp { jobject obj ) { - int engine_obj_hash = (int)callIntMethod(env, obj, "hashCode"); - assert(engine_obj_hash); - std::mutex *engine_obj_mutex = engine_objhash_mutex.at(engine_obj_hash); - pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object hash: " << engine_obj_hash); + long engine_obj_id = (long)callLongMethod(env, obj, "getId"); + assert(engine_obj_id); + std::mutex *engine_obj_mutex = engine_objid_mutex.at(engine_obj_id); + pEpLog(engine_obj_mutex << " with native_handle: " << engine_obj_mutex->native_handle() << " for java object id: " << engine_obj_id); assert(engine_obj_mutex); - engine_objhash_mutex.erase(engine_obj_hash); + engine_objid_mutex.erase(engine_obj_id); delete engine_obj_mutex; } diff --git a/src/jniutils.hh b/src/jniutils.hh index 57a7232..a9cf9a0 100644 --- a/src/jniutils.hh +++ b/src/jniutils.hh @@ -24,7 +24,7 @@ namespace pEp { extern std::mutex global_mutex; // Stores mutex per java object - extern std::unordered_map engine_objhash_mutex; + extern std::unordered_map engine_objid_mutex; // needs to be called after create_engine_java_object_mutex() // and before release_engine_java_object_mutex() diff --git a/test/java/foundation/pEp/jniadapter/test/jni92/TestMain.java b/test/java/foundation/pEp/jniadapter/test/jni92/TestMain.java index 16a020a..000751e 100644 --- a/test/java/foundation/pEp/jniadapter/test/jni92/TestMain.java +++ b/test/java/foundation/pEp/jniadapter/test/jni92/TestMain.java @@ -34,7 +34,7 @@ class TestMain { Engine e; TestUtils.logH2("Creating new Engine"); e = new Engine(); - TestUtils.log("Engine created with java object hash: " + e.hashCode()); + TestUtils.log("Engine created with java object ID: " + e.getId()); return e; } @@ -48,7 +48,7 @@ class TestMain { public static void engineConsumer(Vector ev, Consumer ec) { ev.forEach(e -> { - TestUtils.logH2("engineConsumer: on engine object hash: " + e.hashCode()); + TestUtils.logH2("engineConsumer: on engine java object ID: " + e.getId()); ec.accept(e); }); } @@ -75,13 +75,16 @@ class TestMain { int nrTestruns = 1000; boolean multiThreaded = true; - int nrThreads = 200; + int nrThreads = 20; int nrEnginesPerThread = 1000; for (int run = 0; run < nrTestruns; run++ ) { - TestUtils.logH1("Testrun Nr: " + run); + TestUtils.logH1("Testrun Nr: " + run); if (!multiThreaded) { // Single Threaded +// for (int i = 0; i < nrEnginesPerThread; i++) { +// Engine eni = new Engine(); +// } TestMainRun(nrEnginesPerThread); } else { // Mutli Threaded @@ -104,6 +107,9 @@ class TestMain { } }); } + TestUtils.logH1("Testrun DONE" ); + System.gc(); +// TestUtils.sleep(2000); } } }