diff --git a/libpkl/src/main/c/pkl.c b/libpkl/src/main/c/pkl.c index e2e0788d9..c059729a4 100644 --- a/libpkl/src/main/c/pkl.c +++ b/libpkl/src/main/c/pkl.c @@ -29,11 +29,26 @@ #endif pthread_mutex_t graal_mutex; -graal_isolatethread_t *isolatethread = NULL; +graal_isolatethread_t *graal_isolatethread = NULL; + +int pkl_attach_thread() { + graal_isolate_t *graal_isolate = graal_get_isolate(graal_isolatethread); + if (graal_isolate == NULL) { + perror("pkl_attach_thread: couldn't get isolate"); + return -1; + } + + if (graal_attach_thread(graal_isolate, &graal_isolatethread) != 0) { + perror("pkl_attach_thread: couldn't attach thread"); + return -1; + } + + return 0; +} int pkl_init(PklMessageResponseHandler handler, void *userData) { - if (isolatethread != NULL) { - perror("pkl_init: isolatethread is already initialised"); + if (graal_isolatethread != NULL) { + perror("pkl_init: graal_isolatethread is already initialised"); return -1; } @@ -46,9 +61,9 @@ int pkl_init(PklMessageResponseHandler handler, void *userData) { return -1; } - isolatethread = pkl_internal_init(); - pkl_internal_register_response_handler(isolatethread, handler, userData); - pkl_internal_server_start(isolatethread); + graal_isolatethread = pkl_internal_init(); + pkl_internal_register_response_handler(graal_isolatethread, handler, userData); + pkl_internal_server_start(graal_isolatethread); pthread_mutex_unlock(&graal_mutex); return 0; @@ -59,7 +74,12 @@ int pkl_send_message(int length, char *message) { return -1; } - pkl_internal_send_message(isolatethread, length, message); + if (pkl_attach_thread() != 0) { + perror("pkl_send_message: couldn't attach thread"); + return -1; + } + + pkl_internal_send_message(graal_isolatethread, length, message); pthread_mutex_unlock(&graal_mutex); return 0; @@ -70,9 +90,14 @@ int pkl_close() { return -1; } - pkl_internal_server_stop(isolatethread); - pkl_internal_close(isolatethread); - isolatethread = NULL; + if (pkl_attach_thread() != 0) { + perror("pkl_send_message: couldn't attach thread"); + return -1; + } + + pkl_internal_server_stop(graal_isolatethread); + pkl_internal_close(graal_isolatethread); + graal_isolatethread = NULL; if (pthread_mutex_unlock(&graal_mutex) != 0) { return -1; @@ -86,5 +111,10 @@ int pkl_close() { }; char* pkl_version() { - return pkl_internal_version(isolatethread); + if (pkl_attach_thread() != 0) { + perror("pkl_version: couldn't attach thread"); + return NULL; + } + + return pkl_internal_version(graal_isolatethread); }