1 /* 2 * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef SHARE_VM_RUNTIME_CONTINUATION_HPP 26 #define SHARE_VM_RUNTIME_CONTINUATION_HPP 27 28 #include "jni.h" 29 #include "memory/allStatic.hpp" 30 #include "oops/oopsHierarchy.hpp" 31 32 class ContinuationEntry; 33 class frame; 34 class FrameValues; 35 class Handle; 36 class outputStream; 37 class RegisterMap; 38 39 class Continuations : public AllStatic { 40 public: 41 static void init(); 42 static bool enabled(); 43 }; 44 45 void continuations_init(); 46 47 class javaVFrame; 48 class JavaThread; 49 50 class Continuation : AllStatic { 51 public: 52 53 enum thaw_kind { 54 thaw_top = 0, 55 thaw_return_barrier = 1, 56 thaw_return_barrier_exception = 2, 57 }; 58 59 static bool is_thaw_return_barrier(thaw_kind kind) { 60 return kind != thaw_top; 61 } 62 63 static bool is_thaw_return_barrier_exception(thaw_kind kind) { 64 bool r = (kind == thaw_return_barrier_exception); 65 assert(!r || is_thaw_return_barrier(kind), "must be"); 66 return r; 67 } 68 69 static void init(); 70 71 static address freeze_entry(); 72 static int prepare_thaw(JavaThread* thread, bool return_barrier); 73 static address thaw_entry(); 74 75 static ContinuationEntry* get_continuation_entry_for_continuation(JavaThread* thread, oop continuation); 76 static ContinuationEntry* get_continuation_entry_for_sp(JavaThread* thread, intptr_t* const sp); 77 static ContinuationEntry* get_continuation_entry_for_entry_frame(JavaThread* thread, const frame& f); 78 79 static bool is_continuation_mounted(JavaThread* thread, oop continuation); 80 81 static bool is_cont_barrier_frame(const frame& f); 82 static bool is_return_barrier_entry(const address pc); 83 static bool is_continuation_enterSpecial(const frame& f); 84 static bool is_continuation_entry_frame(const frame& f, const RegisterMap *map); 85 86 static bool is_frame_in_continuation(const ContinuationEntry* entry, const frame& f); 87 static bool is_frame_in_continuation(JavaThread* thread, const frame& f); 88 89 static bool has_last_Java_frame(oop continuation, frame* frame, RegisterMap* map); 90 static frame last_frame(oop continuation, RegisterMap *map); 91 static frame top_frame(const frame& callee, RegisterMap* map); 92 static javaVFrame* last_java_vframe(Handle continuation, RegisterMap *map); 93 static frame continuation_parent_frame(RegisterMap* map); 94 95 static oop continuation_scope(oop continuation); 96 static bool is_scope_bottom(oop cont_scope, const frame& fr, const RegisterMap* map); 97 98 static bool is_in_usable_stack(address addr, const RegisterMap* map); 99 100 // pins/unpins the innermost mounted continuation; returns true on success or false if there's no continuation or the operation failed 101 static bool pin(JavaThread* current); 102 static bool unpin(JavaThread* current); 103 104 static frame continuation_bottom_sender(JavaThread* thread, const frame& callee, intptr_t* sender_sp); 105 static address get_top_return_pc_post_barrier(JavaThread* thread, address pc); 106 static void set_cont_fastpath_thread_state(JavaThread* thread); 107 static void notify_deopt(JavaThread* thread, intptr_t* sp); 108 109 // access frame data 110 111 #ifndef PRODUCT 112 static void describe(FrameValues &values); 113 #endif 114 115 private: 116 friend class InstanceStackChunkKlass; 117 118 #ifdef ASSERT 119 public: 120 static void debug_verify_continuation(oop continuation); 121 static void print(oop continuation); 122 static void print_on(outputStream* st, oop continuation); 123 #endif 124 }; 125 126 void CONT_RegisterNativeMethods(JNIEnv *env, jclass cls); 127 128 #endif // SHARE_VM_RUNTIME_CONTINUATION_HPP