Browse Source

keymanagement thread

JNI-44
Volker Birk 10 years ago
parent
commit
02ba1b07f1
  1. 1
      src/org/pEp/jniadapter/AbstractEngine.java
  2. 55
      src/org_pEp_jniadapter_AbstractEngine.cc

1
src/org/pEp/jniadapter/AbstractEngine.java

@ -28,6 +28,7 @@ abstract class AbstractEngine implements AutoCloseable {
} }
private long keyserverThread; private long keyserverThread;
private long queueThread;
public native void startKeyserverLookup(); public native void startKeyserverLookup();
public native void stopKeyserverLookup(); public native void stopKeyserverLookup();

55
src/org_pEp_jniadapter_AbstractEngine.cc

@ -1,6 +1,7 @@
#include "org_pEp_jniadapter_AbstractEngine.h" #include "org_pEp_jniadapter_AbstractEngine.h"
#include <stdexcept> #include <stdexcept>
#include <unistd.h>
#include <assert.h> #include <assert.h>
#include <pthread.h> #include <pthread.h>
#include <pEp/keymanagement.h> #include <pEp/keymanagement.h>
@ -10,6 +11,7 @@
extern "C" { extern "C" {
using namespace pEp::JNIAdapter; using namespace pEp::JNIAdapter;
using namespace pEp::utility;
JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_init( JNIEXPORT void JNICALL Java_org_pEp_jniadapter_Engine_init(
JNIEnv *env, JNIEnv *env,
@ -64,9 +66,26 @@ extern "C" {
env->SetLongField(me, handle, jlong(0)); 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) 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( JNIEXPORT void JNICALL Java_org_pEp_jniadapter_AbstractEngine_startKeyserverLookup(
@ -75,25 +94,32 @@ extern "C" {
) )
{ {
pthread_t *thread = NULL; pthread_t *thread = NULL;
jfieldID handle; locked_queue< pEp_identity * > *queue = NULL;
jfieldID thread_handle;
jfieldID queue_handle;
try { 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) { catch (std::exception& ex) {
assert(0); assert(0);
return; return;
} }
thread = (pthread_t *) env->GetLongField(obj, handle); thread = (pthread_t *) env->GetLongField(obj, thread_handle);
if (thread) if (thread)
return; return;
thread = (pthread_t *) calloc(1, sizeof(pthread_t)); thread = (pthread_t *) calloc(1, sizeof(pthread_t));
assert(thread); 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( JNIEXPORT void JNICALL Java_org_pEp_jniadapter_AbstractEngine_stopKeyserverLookup(
@ -102,21 +128,30 @@ extern "C" {
) )
{ {
pthread_t *thread = NULL; pthread_t *thread = NULL;
jfieldID handle; locked_queue< pEp_identity * > *queue = NULL;
jfieldID thread_handle;
jfieldID queue_handle;
try { 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) { catch (std::exception& ex) {
assert(0); assert(0);
return; return;
} }
thread = (pthread_t *) env->GetLongField(obj, handle); thread = (pthread_t *) env->GetLongField(obj, thread_handle);
if (!thread) if (!thread)
return; 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" } // extern "C"

Loading…
Cancel
Save