From 56bd06bd02672e71c6ce0c92d378151aab1a1217 Mon Sep 17 00:00:00 2001 From: Kushal Pisavadia Date: Mon, 21 Jul 2025 13:04:08 +0100 Subject: [PATCH 1/2] Rename `isolatethread` to `graal_isolatethread` --- libpkl/src/main/c/pkl.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/libpkl/src/main/c/pkl.c b/libpkl/src/main/c/pkl.c index e2e0788d9..23dc06f93 100644 --- a/libpkl/src/main/c/pkl.c +++ b/libpkl/src/main/c/pkl.c @@ -29,11 +29,11 @@ #endif pthread_mutex_t graal_mutex; -graal_isolatethread_t *isolatethread = NULL; +graal_isolatethread_t *graal_isolatethread = NULL; 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 +46,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 +59,7 @@ int pkl_send_message(int length, char *message) { return -1; } - pkl_internal_send_message(isolatethread, length, message); + pkl_internal_send_message(graal_isolatethread, length, message); pthread_mutex_unlock(&graal_mutex); return 0; @@ -70,9 +70,9 @@ int pkl_close() { return -1; } - pkl_internal_server_stop(isolatethread); - pkl_internal_close(isolatethread); - isolatethread = NULL; + 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 +86,5 @@ int pkl_close() { }; char* pkl_version() { - return pkl_internal_version(isolatethread); + return pkl_internal_version(graal_isolatethread); } From 6857c2ae22212b071ff7744224b14dabb6d3379c Mon Sep 17 00:00:00 2001 From: Kushal Pisavadia Date: Mon, 21 Jul 2025 16:51:18 +0100 Subject: [PATCH 2/2] Run `graal_attach_thread` ahead of all calls This is to deal with the case when using a language like Golang, where a Goroutine is managed by the runtime, and can be moved to an arbitrary system thread behind the scenes. --- libpkl/src/main/c/pkl.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/libpkl/src/main/c/pkl.c b/libpkl/src/main/c/pkl.c index 23dc06f93..c059729a4 100644 --- a/libpkl/src/main/c/pkl.c +++ b/libpkl/src/main/c/pkl.c @@ -31,6 +31,21 @@ pthread_mutex_t graal_mutex; 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 (graal_isolatethread != NULL) { perror("pkl_init: graal_isolatethread is already initialised"); @@ -59,6 +74,11 @@ int pkl_send_message(int length, char *message) { return -1; } + 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); @@ -70,6 +90,11 @@ int pkl_close() { return -1; } + 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; @@ -86,5 +111,10 @@ int pkl_close() { }; char* pkl_version() { + if (pkl_attach_thread() != 0) { + perror("pkl_version: couldn't attach thread"); + return NULL; + } + return pkl_internal_version(graal_isolatethread); }