| /* |
| * 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 |