- msg_task_t task = (msg_task_t) t;
- JNIEnv *env =get_current_thread_env();
- jobject jtask_global = (jobject) MSG_task_get_data(task);
-
- /* Destroy the global ref so that the JVM can free the stuff */
- env->DeleteGlobalRef(jtask_global);
+ auto task = (msg_task_t)t;
+ JNIEnv* env = get_current_thread_env();
+ if (env) {
+ auto jtask_global = (jobject)MSG_task_get_data(task);
+ /* Destroy the global ref so that the JVM can free the stuff */
+ env->DeleteGlobalRef(jtask_global);
+ /* Don't free the C data here, to avoid a race condition with the GC also sometimes doing so.
+ * A rare memleak is seen as preferable to a rare "free(): invalid pointer" failure that
+ * proves really hard to debug.
+ */
+ }