Blob Blame History Raw
diff --git a/frysk-sys/lib/unwind/jni/UnwindH.hxx b/frysk-sys/lib/unwind/jni/UnwindH.hxx
index 76e57b7..5efc541 100644
--- a/frysk-sys/lib/unwind/jni/UnwindH.hxx
+++ b/frysk-sys/lib/unwind/jni/UnwindH.hxx
@@ -63,9 +63,14 @@
 using namespace java::lang;
 using namespace lib::unwind;
 
+struct jni_cursor {
+  unw_cursor_t cursor;
+  jobject addressSpace;
+};
+
 #define UNW_PROC_INFO ((unw_proc_info_t*)unwProcInfo)
 #define UNW_ADDRESS_SPACE ((unw_addr_space_t)unwAddressSpace)
-#define UNW_CURSOR ((unw_cursor_t*)unwCursor)
+#define UNW_CURSOR (&((jni_cursor*)unwCursor)->cursor)
 #define FINE env, (GetFine(env))
 
 #ifndef MAX_VDSO_SIZE
@@ -232,19 +237,23 @@ TARGET::createCursor(jnixx::env env,
 		     AddressSpace addressSpace,
 		     jlong unwAddressSpace) {
   logf(FINE, "createCursor from address-space %lx", (long) UNW_ADDRESS_SPACE);
-  jlong unwCursor = (jlong)::malloc(sizeof(::unw_cursor_t));
+  jni_cursor *cursor = new(jni_cursor);
   // XXX: Need to zero out the cursor, as unw_init_remote doesn't seem
   // to do it.
-  memset(UNW_CURSOR, 0, sizeof(*UNW_CURSOR));
-  unw_init_remote(UNW_CURSOR, UNW_ADDRESS_SPACE, addressSpace._object);
-  logf(FINE, "createCursor at %lx", (long) UNW_CURSOR);
-  return (jlong) UNW_CURSOR;
+  memset(cursor, 0, sizeof(jni_cursor));
+  // Make global as object is used across JNI calls
+  cursor->addressSpace = env.NewGlobalRef(addressSpace._object);
+  unw_init_remote(&cursor->cursor, UNW_ADDRESS_SPACE, cursor->addressSpace);
+  logf(FINE, "createCursor at %p", cursor);
+  return (jlong)cursor;
 }
 
 void
 TARGET::destroyCursor(jnixx::env env, jlong unwCursor) {
-  logf(FINE, "destroyCursor at %lx", (long) UNW_CURSOR);
-  ::free(UNW_CURSOR);
+  jni_cursor *cursor = (jni_cursor*)unwCursor;
+  logf(FINE, "destroyCursor at %p", cursor);
+  env.DeleteGlobalRef(cursor->addressSpace);
+  ::free(cursor);
 }
 
 jlong