vm/include/open/vm_gc.h (50 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _OPEN_VM_GC_H #define _OPEN_VM_GC_H /** * @file * These are the functions that a GC built as a DLL may call. */ #include <stdio.h> #include "open/types.h" #ifdef __cplusplus extern "C" { #endif /** * @return The number of bytes allocated by VM in VTable * for use by GC. */ VMEXPORT size_t vm_number_of_gc_bytes_in_vtable(); /** * @return The number of bytes allocated by VM in thread-local * storage for use by GC. */ VMEXPORT size_t vm_number_of_gc_bytes_in_thread_local(); /** * @return The pointer to thread-local area of current thread. */ VMEXPORT void *vm_get_gc_thread_local(); /** * Initializes the lock that guards all GC-related operations in the VM. */ VMEXPORT void vm_gc_lock_init(); /** * Acquire the lock that guards all GC-related operations in the VM. * If the lock can't be acquired the thread waits until the lock is available. * This operation marks the current thread as being safe for root set * enumeration. */ VMEXPORT void vm_gc_lock_enum(); /** * Release the system-wide lock acquired by <code>vm_gc_lock_enum()</code>. * The thread is marked as unsafe for root set enumeration. */ VMEXPORT void vm_gc_unlock_enum(); /** * GC calls this function to command VM to start root set enumeration. * * Root set enumeration for all managed threads. */ VMEXPORT void vm_enumerate_root_set_all_threads(); /** * GC calls this function to restart managed threads after root set * enumeration is complete. * * This function resumes all threads suspended by * vm_enumerate_root_set_all_threads() */ VMEXPORT void vm_resume_threads_after(); /** * GC calls this function in stop the world state when all live objects * are marked. This is the callback to classloader allowing it to * gather needed statics for class unloading. * * @sa gc interface functions: gc_get_next_live_object(void *iterator) */ VMEXPORT void vm_classloader_iterate_objects(void *iterator); /** * GC calls this function during heap iteration to iterate * one object. The GC aborts heap iteration if this function * returns false. * * @return <code>TRUE</code> to continue heap iteration, <code>FALSE</code> to abort * * @sa gc.h#gc_iterate_heap() */ VMEXPORT bool vm_iterate_object(Managed_Object_Handle object); /** * GC calls this function to hint VM that finalizers may need to be run * and references enqueued. This method is guaranteed not to hold global * GC lock. * * @note The function introduced as a workaround for running finalizers * until a complete solution with finalizer thread is implemented. */ VMEXPORT void vm_hint_finalize(); VMEXPORT bool is_it_finalize_thread(); /** * thread state as concerns root set enumeration. */ enum safepoint_state { nill = 0, /** * Thread is stopped for root set enumeration, * as is the whole world (all managed threads). */ enumerate_the_universe, /** * Thread is stopped for root set enumeration */ java_suspend_one_thread, /** * Thread is stopped by java debugger. */ java_debugger }; /** * @return <code>TRUE</code> if no apparent trash was found in the object. * * Used for debugging. */ VMEXPORT Boolean verify_object_header(void *ptr); /** * Routines to support lifecycle management of resources associated * with a java object */ VMEXPORT void vm_notify_obj_alive(void *); VMEXPORT void vm_reclaim_native_objs(); /* * ***** * * * * Routines to support finalization of objects. * * * ***** */ //@{ /** * GC should call this function when an object becomes * "f-reachable, finalizable" * The VM later finalizes those objects in a way that * is not part of this interface. * * VM must not call finalizer immediately to prevent * deadlocks in user code, because this functions * may be called during the stop-the-world phase. */ VMEXPORT void vm_finalize_object(Managed_Object_Handle p_obj); VMEXPORT void set_native_finalizer_thread_flag(Boolean flag); VMEXPORT void vm_heavy_finalizer_block_mutator(void); //@} /** * GC should call this function when an phantom reference object * is to be enqueued, i.e. when the reference is not reachable anymore. */ VMEXPORT void vm_enqueue_reference(Managed_Object_Handle p_obj); VMEXPORT void set_native_ref_enqueue_thread_flag(Boolean flag); /* * Returns handle of a class for a specified vtable * * @param vh - handle of vtable to retrieve class for * * @return class handle for a specified vtable */ VMEXPORT Class_Handle vtable_get_class(VTable_Handle vh); /** * GC calls this function for each live object it finds in heap. * This is used for finding unreferenced class loaders for class * unloading. * Notifies VM that live object of this class was found in the heap * * @param clss - class of live object in Java heap */ VMEXPORT void vm_notify_live_object_class(Class_Handle clss); #define CL_PROP_ALIGNMENT_MASK 0x00FFF ///< @sa <code>class_properties</code> #define CL_PROP_NON_REF_ARRAY_MASK 0x01000 ///< @sa <code>class_properties</code> #define CL_PROP_ARRAY_MASK 0x02000 ///< @sa <code>class_properties</code> #define CL_PROP_PINNED_MASK 0x04000 ///< @sa <code>class_properties</code> #define CL_PROP_FINALIZABLE_MASK 0x08000 ///< @sa <code>class_properties</code> /** * @section class_properties Class properties flags * 3322|2222|2222|1111|1111|1100|0000|0000 * 1098|7654|3210|9876|5432|1098|7654|3210 * ^^^^^^^^^^^^^^------ CL_PROP_ALIGNMENT_MASK * ^--------------------- CL_PROP_NON_REF_ARRAY_MASK * ^---------------------- CL_PROP_ARRAY_MASK * ^----------------------- CL_PROP_PINNED_MASK * ^------------------------ CL_PROP_FINALIZABLE_MASK */ /** * extract the recursion counter from object lockword. */ #define P_RECURSION_BYTE(x) ( (U_8 *)(((x)->get_obj_info_addr())) + 1 ) #ifdef GC_PUBLIC_PRIVATE /** * mask of recursion counter */ #define RECURSION_MASK 0x7f /** * mask of recursion counter shifted to its position in lockword. */ #define RECURSION_MASK_SHIFTED 0x7f00 #define PUBLIC_PRIVATE_MASK 0x80 #endif /* #ifdef GC_PUBLIC_PRIVATE */ #ifdef __cplusplus } #endif /** * \page vm_finalization_and_weak_refs Design of finalization and weak references in VM. * * @author Salikh Zakirov * @version written on 2005-05-31 * * \section vm_finalization_interactions Object Finalization * * As described elsewhere, VM calls function gc_class_prepared() * as a mandatory step of class preparation process, in order that GC * have a chance to create its own class-specific structure (known as GCVT). * During this call, GC can call class_is_finalizable() to find out * whether the instances of this class require finalizers to be run. * The result is stored in GCVT for later use. * * At a later stage, when VM requests an object to be allocated by calling * gc_alloc(), or gc_alloc_fast(), GC consults its GCVT to find out whether * this class of objects needs to be finalized, and if so, adds the object * reference in the finalizable queue, maintained by the GC. Allocation * of finalizable objects is guarded from being handled by the inlined * fast path by object size overloading hack (see \ref allocation). * This is needed due to the optimized nature of allocation fast path: * fast path assumes that objects don't need any special handling, * and we must ensure fast path fails for all object that do require * special handling such as finalization. * * Later, when the garbage is being collected, GC walks over the finalizable * object list and checks if the objects became eligible for finalization (i.e. * not reachable otherwise). The GC side of the story is described in more detail * in \ref gc_finalization_and_weak_refs Object chosen for finalization are then "revived" * and reported to the VM using vm_finalize_object(). Reviving is performed by * marking the object in order to prevent it from being collected before the * finalizer has been run. VM places all reported objects to its internal * finalization queue and runs the finalizers in a separate thread at a later * (unspecified) time. Note, that while running finalization in a dedicated * thread is not directly required by the java specification, it is highly * desirable in order to improve overall VM robustness, because finalizers may * contain user code of arbitrary complexity, including synchronization with * other user threads. Thus, running finalizers as a step of garbage collection * process while other user threads are suspended will introduce a risk of * deadlock and thus must be avoided. * * As finalization queue stores direct references to java heap, it is * must be handled properly during heap compaction, by adding the locations * of the pointers to the list of the slots updated during compaction. * * \section vm_finalization_requirements Finalization requirements * * The process described above places following requirements * \li Finalizable objects must be allocated by calling into GC, that is * not by the inlined fast path. * \li vm_finalize_object() must defer running of finalizers to a later * stage after the user java threads are resumed. * * * \section vm_weak_refs Weak references * * See the description of how weak references work in GC: * \ref gc_finalization_and_weak_refs * */ #endif // _OPEN_VM_GC_H