< prev index next >

src/hotspot/share/runtime/interfaceSupport.inline.hpp

Print this page

        

*** 325,335 **** if (_thread->has_special_runtime_exit_condition()) _thread->handle_special_runtime_exit_condition(false); } }; ! // Debug class instantiated in JRT_ENTRY and ITR_ENTRY macro. // Can be used to verify properties on enter/exit of the VM. #ifdef ASSERT class VMEntryWrapper { public: --- 325,335 ---- if (_thread->has_special_runtime_exit_condition()) _thread->handle_special_runtime_exit_condition(false); } }; ! // Debug class instantiated in JRT_ENTRY macro. // Can be used to verify properties on enter/exit of the VM. #ifdef ASSERT class VMEntryWrapper { public:
*** 338,396 **** }; class VMNativeEntryWrapper { public: ! VMNativeEntryWrapper() { ! if (GCALotAtAllSafepoints) InterfaceSupport::check_gc_alot(); ! } ! ! ~VMNativeEntryWrapper() { ! if (GCALotAtAllSafepoints) InterfaceSupport::check_gc_alot(); ! } }; - #endif - - - // VM-internal runtime interface support - - // Definitions for JRT (Java (Compiler/Shared) Runtime) - - // JRT_LEAF currently can be called from either _thread_in_Java or - // _thread_in_native mode. In _thread_in_native, it is ok - // for another thread to trigger GC. The rest of the JRT_LEAF - // rules apply. - class JRTLeafVerifier : public NoSafepointVerifier { - static bool should_verify_GC(); - public: - #ifdef ASSERT - JRTLeafVerifier(); - ~JRTLeafVerifier(); - #else - JRTLeafVerifier() {} - ~JRTLeafVerifier() {} - #endif - }; - - #ifdef ASSERT - class RuntimeHistogramElement : public HistogramElement { public: RuntimeHistogramElement(const char* name); }; #define TRACE_CALL(result_type, header) \ InterfaceSupport::_number_of_calls++; \ if (CountRuntimeCalls) { \ static RuntimeHistogramElement* e = new RuntimeHistogramElement(#header); \ if (e != NULL) e->increment_count(); \ } #else #define TRACE_CALL(result_type, header) \ /* do nothing */ ! #endif // LEAF routines do not lock, GC or throw exceptions #define VM_LEAF_BASE(result_type, header) \ --- 338,368 ---- }; class VMNativeEntryWrapper { public: ! VMNativeEntryWrapper(); ! ~VMNativeEntryWrapper(); }; class RuntimeHistogramElement : public HistogramElement { public: RuntimeHistogramElement(const char* name); }; + #endif // ASSERT + #ifdef ASSERT #define TRACE_CALL(result_type, header) \ InterfaceSupport::_number_of_calls++; \ if (CountRuntimeCalls) { \ static RuntimeHistogramElement* e = new RuntimeHistogramElement(#header); \ if (e != NULL) e->increment_count(); \ } #else #define TRACE_CALL(result_type, header) \ /* do nothing */ ! #endif // ASSERT // LEAF routines do not lock, GC or throw exceptions #define VM_LEAF_BASE(result_type, header) \
*** 432,446 **** result_type header { \ ThreadInVMfromJava __tiv(thread); \ VM_ENTRY_BASE(result_type, header, thread) \ debug_only(VMEntryWrapper __vew;) #define JRT_LEAF(result_type, header) \ result_type header { \ VM_LEAF_BASE(result_type, header) \ ! debug_only(JRTLeafVerifier __jlv;) #define JRT_ENTRY_NO_ASYNC(result_type, header) \ result_type header { \ ThreadInVMfromJavaNoAsyncException __tiv(thread); \ --- 404,431 ---- result_type header { \ ThreadInVMfromJava __tiv(thread); \ VM_ENTRY_BASE(result_type, header, thread) \ debug_only(VMEntryWrapper __vew;) + // JRT_LEAF currently can be called from either _thread_in_Java or + // _thread_in_native mode. + // + // JRT_LEAF rules: + // A JRT_LEAF method may not interfere with safepointing by + // 1) acquiring or blocking on a Mutex or JavaLock - checked + // 2) allocating heap memory - checked + // 3) executing a VM operation - checked + // 4) executing a system call (including malloc) that could block or grab a lock + // 5) invoking GC + // 6) reaching a safepoint + // 7) running too long + // Nor may any method it calls. #define JRT_LEAF(result_type, header) \ result_type header { \ VM_LEAF_BASE(result_type, header) \ ! debug_only(NoSafepointVerifier __nsv;) #define JRT_ENTRY_NO_ASYNC(result_type, header) \ result_type header { \ ThreadInVMfromJavaNoAsyncException __tiv(thread); \
< prev index next >