1 /* 2 * Copyright (c) 1997, 2022, Oracle and/or its affiliates. All rights reserved. 3 * Copyright (c) 2021, Azul Systems, Inc. All rights reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 * 24 */ 25 26 #ifndef SHARE_RUNTIME_THREADS_HPP 27 #define SHARE_RUNTIME_THREADS_HPP 28 29 #include "jni.h" 30 #include "utilities/exceptions.hpp" 31 #include "utilities/globalDefinitions.hpp" 32 #include "utilities/macros.hpp" 33 34 class JavaThread; 35 class Metadata; 36 class Thread; 37 class ThreadClosure; 38 class ThreadsList; 39 class outputStream; 40 41 class CodeBlobClosure; 42 class MetadataClosure; 43 class OopClosure; 44 45 // The active thread queue. It also keeps track of the current used 46 // thread priorities. 47 class Threads: AllStatic { 48 friend class VMStructs; 49 private: 50 static int _number_of_threads; 51 static int _number_of_non_daemon_threads; 52 static int _return_code; 53 static uintx _thread_claim_token; 54 #ifdef ASSERT 55 static bool _vm_complete; 56 #endif 57 58 static void initialize_java_lang_classes(JavaThread* main_thread, TRAPS); 59 static void initialize_jsr292_core_classes(TRAPS); 60 61 public: 62 // Thread management 63 // force_daemon is a concession to JNI, where we may need to add a 64 // thread to the thread list before allocating its thread object 65 static void add(JavaThread* p, bool force_daemon = false); 66 static void remove(JavaThread* p, bool is_daemon); 67 static void non_java_threads_do(ThreadClosure* tc); 68 static void java_threads_do(ThreadClosure* tc); 69 static void threads_do(ThreadClosure* tc); 70 static void possibly_parallel_threads_do(bool is_par, ThreadClosure* tc); 71 72 // Initializes the vm and creates the vm thread 73 static jint create_vm(JavaVMInitArgs* args, bool* canTryAgain); 74 static void convert_vm_init_libraries_to_agents(); 75 static void create_vm_init_libraries(); 76 static void create_vm_init_agents(); 77 static void shutdown_vm_agents(); 78 static void destroy_vm(); 79 // Supported VM versions via JNI 80 // Includes JNI_VERSION_1_1 81 static jboolean is_supported_jni_version_including_1_1(jint version); 82 // Does not include JNI_VERSION_1_1 83 static jboolean is_supported_jni_version(jint version); 84 85 private: 86 // The "thread claim token" provides a way for threads to be claimed 87 // by parallel worker tasks. 88 // 89 // Each thread contains a "token" field. A task will claim the 90 // thread only if its token is different from the global token, 91 // which is updated by calling change_thread_claim_token(). When 92 // a thread is claimed, it's token is set to the global token value 93 // so other threads in the same iteration pass won't claim it. 94 // 95 // For this to work change_thread_claim_token() needs to be called 96 // exactly once in sequential code before starting parallel tasks 97 // that should claim threads. 98 // 99 // New threads get their token set to 0 and change_thread_claim_token() 100 // never sets the global token to 0. 101 static uintx thread_claim_token() { return _thread_claim_token; } 102 103 public: 104 static void change_thread_claim_token(); 105 static void assert_all_threads_claimed() NOT_DEBUG_RETURN; 106 107 // Apply "f->do_oop" to all root oops in all threads. 108 // This version may only be called by sequential code. 109 static void oops_do(OopClosure* f, CodeBlobClosure* cf); 110 // This version may be called by sequential or parallel code. 111 static void possibly_parallel_oops_do(bool is_par, OopClosure* f, CodeBlobClosure* cf); 112 113 // RedefineClasses support 114 static void metadata_do(MetadataClosure* f); 115 static void metadata_handles_do(void f(Metadata*)); 116 117 #ifdef ASSERT 118 static bool is_vm_complete() { return _vm_complete; } 119 #endif // ASSERT 120 121 // Verification 122 static void verify(); 123 static void print_on(outputStream* st, bool print_stacks, bool internal_format, bool print_concurrent_locks, bool print_extended_info); 124 static void print(bool print_stacks, bool internal_format) { 125 // this function is only used by debug.cpp 126 print_on(tty, print_stacks, internal_format, false /* no concurrent lock printed */, false /* simple format */); 127 } 128 static void print_on_error(outputStream* st, Thread* current, char* buf, int buflen); 129 static void print_on_error(Thread* this_thread, outputStream* st, Thread* current, char* buf, 130 int buflen, bool* found_current); 131 static void print_threads_compiling(outputStream* st, char* buf, int buflen, bool short_form = false); 132 133 // Get Java threads that are waiting to enter a monitor. 134 static GrowableArray<JavaThread*>* get_pending_threads(ThreadsList * t_list, 135 int count, address monitor); 136 137 // Get owning Java thread from the monitor's owner field. 138 static JavaThread *owning_thread_from_monitor_owner(ThreadsList * t_list, 139 address owner); 140 141 static JavaThread* owning_thread_from_monitor(ThreadsList* t_list, ObjectMonitor* owner); 142 143 // Number of threads on the active threads list 144 static int number_of_threads() { return _number_of_threads; } 145 // Number of non-daemon threads on the active threads list 146 static int number_of_non_daemon_threads() { return _number_of_non_daemon_threads; } 147 148 struct Test; // For private gtest access. 149 }; 150 151 #endif // SHARE_RUNTIME_THREADS_HPP