|
|
@ -12,17 +12,17 @@ |
|
|
|
namespace pEp { |
|
|
|
namespace JNIAdapter { |
|
|
|
std::mutex global_mutex; |
|
|
|
std::unordered_map<int, std::mutex*> engine_objhash_mutex; |
|
|
|
std::unordered_map<long, std::mutex*> 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; |
|
|
|
} |
|
|
|
|
|
|
|