// boehm.cc - interface between libjava and Boehm GC.
-/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
Free Software Foundation
This file is part of libgcj.
p = (GC_PTR) c->aux_info;
MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, c);
+ p = (GC_PTR) c->reflection_data;
+ MAYBE_MARK (p, mark_stack_ptr, mark_stack_limit, c);
+
// The class chain must be marked for runtime-allocated Classes
// loaded by the bootstrap ClassLoader.
p = (GC_PTR) c->next_or_version;
return (void *) GC_MALLOC (size ? size : 1);
}
+typedef _Jv_ClosureList *closure_list_pointer;
+
+/* Release closures in a _Jv_ClosureList. */
+static void
+finalize_closure_list (GC_PTR obj, GC_PTR)
+{
+ _Jv_ClosureList **clpp = (_Jv_ClosureList **)obj;
+ _Jv_ClosureList::releaseClosures (clpp);
+}
+
+/* Allocate a double-indirect pointer to a _Jv_ClosureList that will
+ get garbage-collected after this double-indirect pointer becomes
+ unreachable by any other objects, including finalizable ones. */
+_Jv_ClosureList **
+_Jv_ClosureListFinalizer ()
+{
+ _Jv_ClosureList **clpp;
+ clpp = (_Jv_ClosureList **)_Jv_AllocBytes (sizeof (*clpp));
+ GC_REGISTER_FINALIZER_UNREACHABLE (clpp, finalize_closure_list,
+ NULL, NULL, NULL);
+ return clpp;
+}
+
static void
call_finalizer (GC_PTR obj, GC_PTR client_data)
{
GC_resume_thread (_Jv_GetPlatformThreadID (thread));
#endif
}
+
+void
+_Jv_GCAttachThread ()
+{
+ // The registration interface is only defined on posixy systems and
+ // only actually works if pthread_getattr_np is defined.
+ // FIXME: until gc7 it is simpler to disable this on solaris.
+#if defined(HAVE_PTHREAD_GETATTR_NP) && !defined(GC_SOLARIS_THREADS)
+ GC_register_my_thread ();
+#endif
+}
+
+void
+_Jv_GCDetachThread ()
+{
+#if defined(HAVE_PTHREAD_GETATTR_NP) && !defined(GC_SOLARIS_THREADS)
+ GC_unregister_my_thread ();
+#endif
+}