From 02ba1b07f1b3467bacfca096500201fef41ea455 Mon Sep 17 00:00:00 2001 From: Volker Birk Date: Fri, 21 Aug 2015 21:54:23 +0200 Subject: [PATCH] keymanagement thread --- src/org/pEp/jniadapter/AbstractEngine.java | 1 + src/org_pEp_jniadapter_AbstractEngine.cc | 55 ++++++++++++++++++---- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/org/pEp/jniadapter/AbstractEngine.java b/src/org/pEp/jniadapter/AbstractEngine.java index 799cd82..1475aa6 100644 --- a/src/org/pEp/jniadapter/AbstractEngine.java +++ b/src/org/pEp/jniadapter/AbstractEngine.java @@ -28,6 +28,7 @@ abstract class AbstractEngine implements AutoCloseable { } private long keyserverThread; + private long queueThread; public native void startKeyserverLookup(); public native void stopKeyserverLookup(); diff --git a/src/org_pEp_jniadapter_AbstractEngine.cc b/src/org_pEp_jniadapter_AbstractEngine.cc index 0e2cebe..c4f0966 100644 --- a/src/org_pEp_jniadapter_AbstractEngine.cc +++ b/src/org_pEp_jniadapter_AbstractEngine.cc @@ -1,6 +1,7 @@ #include "org_pEp_jniadapter_AbstractEngine.h" #include +#include #include #include #include @@ -10,6 +11,7 @@ extern "C" { using namespace pEp::JNIAdapter; + using namespace pEp::utility; JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_init( JNIEnv *env, @@ -64,9 +66,26 @@ extern "C" { env->SetLongField(me, handle, jlong(0)); } + pEp_identity *retrieve_next_identity(void *arg) + { + locked_queue< pEp_identity * > *queue = (locked_queue< pEp_identity * > *) arg; + + while (!queue->size()) + usleep(10000); + + pEp_identity *ident = queue->front(); + queue->pop_front(); + return ident; + } + static void *start_routine(void *arg) { - return NULL; + PEP_STATUS status = do_keymanagement(retrieve_next_identity, arg); + + locked_queue< pEp_identity * > *queue = (locked_queue< pEp_identity * > *) arg; + delete queue; + + return (void *) status; } JNIEXPORT void JNICALL Java_org_pEp_jniadapter_AbstractEngine_startKeyserverLookup( @@ -75,25 +94,32 @@ extern "C" { ) { pthread_t *thread = NULL; - jfieldID handle; + locked_queue< pEp_identity * > *queue = NULL; + + jfieldID thread_handle; + jfieldID queue_handle; try { - handle = getFieldID(env, "org/pEp/jniadapter/Engine", "keyserverThread", "J"); + thread_handle = getFieldID(env, "org/pEp/jniadapter/Engine", "keyserverThread", "J"); + queue_handle = getFieldID(env, "org/pEp/jniadapter/Engine", "queueThread", "J"); } catch (std::exception& ex) { assert(0); return; } - thread = (pthread_t *) env->GetLongField(obj, handle); + thread = (pthread_t *) env->GetLongField(obj, thread_handle); if (thread) return; thread = (pthread_t *) calloc(1, sizeof(pthread_t)); assert(thread); - env->SetLongField(obj, handle, (jlong) thread); + env->SetLongField(obj, thread_handle, (jlong) thread); - pthread_create(thread, NULL, start_routine, NULL); + queue = new locked_queue< pEp_identity * >(); + env->SetLongField(obj, queue_handle, (jlong) queue); + + pthread_create(thread, NULL, start_routine, (void *) queue); } JNIEXPORT void JNICALL Java_org_pEp_jniadapter_AbstractEngine_stopKeyserverLookup( @@ -102,21 +128,30 @@ extern "C" { ) { pthread_t *thread = NULL; - jfieldID handle; + locked_queue< pEp_identity * > *queue = NULL; + + jfieldID thread_handle; + jfieldID queue_handle; try { - handle = getFieldID(env, "org/pEp/jniadapter/Engine", "keyserverThread", "J"); + thread_handle = getFieldID(env, "org/pEp/jniadapter/Engine", "keyserverThread", "J"); + queue_handle = getFieldID(env, "org/pEp/jniadapter/Engine", "queueThread", "J"); } catch (std::exception& ex) { assert(0); return; } - thread = (pthread_t *) env->GetLongField(obj, handle); + thread = (pthread_t *) env->GetLongField(obj, thread_handle); if (!thread) return; - // stop thread + queue = (locked_queue< pEp_identity * > *) env->GetLongField(obj, queue_handle); + + env->SetLongField(obj, queue_handle, (jlong) 0); + env->SetLongField(obj, thread_handle, (jlong) 0); + + queue->push_front(NULL); } } // extern "C"