1 /*
  2  * Copyright (c) 1997, 2024, 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   // Get owning Java thread from the basicLock address.
139   static JavaThread *owning_thread_from_stacklock(ThreadsList * t_list, address basicLock);
140 
141   static JavaThread* owning_thread_from_object(ThreadsList* t_list, oop obj);
142   static JavaThread* owning_thread_from_monitor(ThreadsList* t_list, ObjectMonitor* owner);
143 
144   // Number of threads on the active threads list
145   static int number_of_threads()                 { return _number_of_threads; }
146   // Number of non-daemon threads on the active threads list
147   static int number_of_non_daemon_threads()      { return _number_of_non_daemon_threads; }
148 
149   struct Test;                  // For private gtest access.
150 };
151 
152 #endif // SHARE_RUNTIME_THREADS_HPP