1 /*
2 * Copyright (c) 1997, 2025, 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 MetadataClosure;
37 class OopClosure;
38 class Thread;
39 class ThreadClosure;
40 class ThreadsList;
41 class outputStream;
42
43 // The active thread queue. It also keeps track of the current used
44 // thread priorities.
45 class Threads: AllStatic {
46 friend class VMStructs;
47 private:
48 static int _number_of_threads;
49 static int _number_of_non_daemon_threads;
50 static int _return_code;
51 static uintx _thread_claim_token;
52 #ifdef ASSERT
53 static bool _vm_complete;
54 #endif
55
56 static void initialize_java_lang_classes(JavaThread* main_thread, TRAPS);
57 static bool initialize_compilation(TRAPS);
58 static void initialize_jsr292_core_classes(TRAPS);
59
60 public:
61 // Thread management
62 // force_daemon is a concession to JNI, where we may need to add a
63 // thread to the thread list before allocating its thread object
64 static void add(JavaThread* p, bool force_daemon = false);
65 static void remove(JavaThread* p, bool is_daemon);
66 static void non_java_threads_do(ThreadClosure* tc);
67 static void java_threads_do(ThreadClosure* tc);
68 static void threads_do(ThreadClosure* tc);
69 static void possibly_parallel_threads_do(bool is_par, ThreadClosure* tc);
70
71 // Initializes the vm and creates the vm thread
72 static jint create_vm(JavaVMInitArgs* args, bool* canTryAgain);
73 static void convert_vm_init_libraries_to_agents();
74 static void create_vm_init_libraries();
75 static void create_vm_init_agents();
76 static void shutdown_vm_agents();
77 static void destroy_vm();
78 // Supported VM versions via JNI
79 // Includes JNI_VERSION_1_1
80 static jboolean is_supported_jni_version_including_1_1(jint version);
81 // Does not include JNI_VERSION_1_1
82 static jboolean is_supported_jni_version(jint version);
83
84 private:
85 // The "thread claim token" provides a way for threads to be claimed
86 // by parallel worker tasks.
87 //
88 // Each thread contains a "token" field. A task will claim the
89 // thread only if its token is different from the global token,
90 // which is updated by calling change_thread_claim_token(). When
91 // a thread is claimed, it's token is set to the global token value
92 // so other threads in the same iteration pass won't claim it.
93 //
94 // For this to work change_thread_claim_token() needs to be called
95 // exactly once in sequential code before starting parallel tasks
96 // that should claim threads.
97 //
98 // New threads get their token set to 0 and change_thread_claim_token()
99 // never sets the global token to 0.
100 static uintx thread_claim_token() { return _thread_claim_token; }
101
102 public:
103 static void change_thread_claim_token();
104 static void assert_all_threads_claimed() NOT_DEBUG_RETURN;
105
106 // Apply "f->do_oop" to all root oops in all threads.
107 // This version may only be called by sequential code.
108 static void oops_do(OopClosure* f, NMethodClosure* cf);
109 // This version may be called by sequential or parallel code.
110 static void possibly_parallel_oops_do(bool is_par, OopClosure* f, NMethodClosure* cf);
111
112 // RedefineClasses support
113 static void metadata_do(MetadataClosure* f);
114 static void metadata_handles_do(void f(Metadata*));
115
116 #ifdef ASSERT
117 static bool is_vm_complete() { return _vm_complete; }
118 #endif // ASSERT
119
120 // Verification
121 static void verify();
122 static void print_on(outputStream* st, bool print_stacks, bool internal_format, bool print_concurrent_locks, bool print_extended_info);
123 static void print(bool print_stacks, bool internal_format) {
124 // this function is only used by debug.cpp
125 print_on(tty, print_stacks, internal_format, false /* no concurrent lock printed */, false /* simple format */);
126 }
127 static void print_on_error(outputStream* st, Thread* current, char* buf, int buflen);
128 static void print_on_error(Thread* this_thread, outputStream* st, Thread* current, char* buf,
129 int buflen, bool* found_current);
130 // Print threads busy compiling, and returns the number of printed threads.
131 static unsigned print_threads_compiling(outputStream* st, char* buf, int buflen, bool short_form = false);
132
133 // Get Java threads that are waiting to enter or re-enter the specified monitor.
134 // Java threads that are executing mounted virtual threads are not included.
135 static GrowableArray<JavaThread*>* get_pending_threads(ThreadsList * t_list,
136 int count, address monitor);
137
138 static JavaThread* owning_thread_from_object(ThreadsList* t_list, oop obj);
139 static JavaThread* owning_thread_from_monitor(ThreadsList* t_list, ObjectMonitor* owner);
140
141 // Number of threads on the active threads list
142 static int number_of_threads() { return _number_of_threads; }
143 // Number of non-daemon threads on the active threads list
144 static int number_of_non_daemon_threads() { return _number_of_non_daemon_threads; }
145
146 struct Test; // For private gtest access.
147 };
148
149 // Used by GC for calling Threads::possibly_parallel_oops_do.
150 struct ThreadsClaimTokenScope : StackObj {
151 ThreadsClaimTokenScope() {
152 Threads::change_thread_claim_token();
153 }
154 ~ThreadsClaimTokenScope() {
155 Threads::assert_all_threads_claimed();
156 }
157 };
158
159 #endif // SHARE_RUNTIME_THREADS_HPP