45 #if defined(ENABLE_GC_BOEHM)
46 # include "mm/boehm-gc/include/gc.h"
49 #define DEBUG_NAME "finalizer"
130 #if defined(ENABLE_GC_BOEHM)
141 std::multimap<java_handle_t *, FinalizerData> *
final_map;
157 #if defined(ENABLE_GC_BOEHM)
158 final_map =
new std::multimap<java_handle_t *, FinalizerData>;
159 final_mutex =
new Mutex;
181 if (!finalizer_thread_coord->
accept()) {
191 LOG(
"[finalizer thread : status=sleeping]" <<
cacao::nl);
192 finalizer_thread_coord->
done();
217 finalizer_thread_coord->
join();
231 #if defined(ENABLE_THREADS)
234 finalizer_thread_coord->
request();
257 #if !defined(ENABLE_GC_CACAO) && defined(ENABLE_HANDLES)
265 LOG(
"[finalizer running :"
284 #if defined(ENABLE_GC_BOEHM)
289 #if defined(ENABLE_GC_BOEHM)
293 typedef std::multimap<java_handle_t *, FinalizerData>::iterator MI;
296 MI it_first =
final_map->lower_bound(hdl), it = it_first;
297 assert(it->first == hdl);
298 for (; it->first == hdl; ++it) {
300 it->second.f(hdl, it->second.data);
319 GC_finalization_proc ofinal = 0;
329 GC_REGISTER_FINALIZER_NO_ORDER(
LLNI_DIRECT(h), ofinal, odata, 0, 0);
331 typedef std::multimap<java_handle_t *, FinalizerData>::iterator MI;
332 std::pair<MI, MI> r =
final_map->equal_range(h);
333 for (MI it = r.first; it != r.second; ++it)
334 if (it->second.f == f)
335 return it->second.data;
351 std::multimap<java_handle_t *, FinalizerData>::iterator it =
final_map->find(h);
void exceptions_print_stacktrace(void)
FinalizerThreadCoordinator()
void signal()
Restarts one of the threads that are waiting on this condition variable.
#define DEBUG(STMT)
Execute debug statements in your current module.
bool threads_thread_start_internal(Utf8String name, functionptr f)
typedef void(JNICALL *jvmtiEventSingleStep)(jvmtiEnv *jvmti_env
void(* FinalizerFunc)(java_handle_t *h, void *data)
void finalizer_join_thread()
Dummy implementation of a mutex.
java_handle_t * vm_call_method(methodinfo *m, java_handle_t *o,...)
static void * attach_custom_finalizer(java_handle_t *h, FinalizerFunc f, void *data)
JNIEnv jclass jobject const char * name
FinalizerData(Finalizer::FinalizerFunc f, void *data)
std::multimap< java_handle_t *, FinalizerData > * final_map
#define TRACESUBSYSTEMINITIALIZATION(text)
void gc_invoke_finalizers(void)
#define LLNI_class_get(obj, variable)
bool finalizer_start_thread()
static Utf8String from_utf8(const char *, size_t)
Dummy condition variable.
static void finalizer_thread()
Helper class used to implicitly acquire and release a mutex within a method scope.
void finalizer_run(void *o, void *p)
Finalizer::FinalizerFunc f
#define LOG(STMT)
Analogous to DEBUG.
static void custom_finalizer_handler(void *object, void *data)
static FinalizerThreadCoordinator * finalizer_thread_coord
void exceptions_clear_exception(void)
java_handle_t * exceptions_get_exception(void)
void unlock()
Unlocks the given mutex object and checks for errors.
void wait(Mutex *mutex)
Waits for the condition variable.
void lock()
Locks the given mutex object and checks for errors.
static void reinstall_custom_finalizer(java_handle_t *h)