duke@435: /* mikael@4153: * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. duke@435: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@435: * duke@435: * This code is free software; you can redistribute it and/or modify it duke@435: * under the terms of the GNU General Public License version 2 only, as duke@435: * published by the Free Software Foundation. duke@435: * duke@435: * This code is distributed in the hope that it will be useful, but WITHOUT duke@435: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@435: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@435: * version 2 for more details (a copy is included in the LICENSE file that duke@435: * accompanied this code). duke@435: * duke@435: * You should have received a copy of the GNU General Public License version duke@435: * 2 along with this work; if not, write to the Free Software Foundation, duke@435: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@435: * trims@1907: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA trims@1907: * or visit www.oracle.com if you need additional information or have any trims@1907: * questions. duke@435: * duke@435: */ duke@435: stefank@2314: #ifndef SHARE_VM_RUNTIME_JAVA_HPP stefank@2314: #define SHARE_VM_RUNTIME_JAVA_HPP stefank@2314: stefank@2314: #include "runtime/os.hpp" stefank@2314: duke@435: // Register function to be called by before_exit duke@435: extern "C" { void register_on_exit_function(void (*func)(void)) ;} duke@435: duke@435: // Execute code before all handles are released and thread is killed; prologue to vm_exit duke@435: extern void before_exit(JavaThread * thread); duke@435: duke@435: // Forced VM exit (i.e, internal error or JVM_Exit) duke@435: extern void vm_exit(int code); duke@435: duke@435: // Wrapper for ::exit() duke@435: extern void vm_direct_exit(int code); duke@435: duke@435: // Shutdown the VM but do not exit the process duke@435: extern void vm_shutdown(); duke@435: // Shutdown the VM and abort the process poonam@662: extern void vm_abort(bool dump_core=true); duke@435: duke@435: // Trigger any necessary notification of the VM being shutdown duke@435: extern void notify_vm_shutdown(); duke@435: duke@435: // VM exit if error occurs during initialization of VM duke@435: extern void vm_exit_during_initialization(Handle exception); coleenp@2497: extern void vm_exit_during_initialization(Symbol* exception_name, const char* message); duke@435: extern void vm_exit_during_initialization(const char* error, const char* message = NULL); duke@435: extern void vm_shutdown_during_initialization(const char* error, const char* message = NULL); duke@435: kamg@677: /** kamg@677: * Discovering the JDK_Version during initialization is tricky when the kamg@677: * running JDK is less than JDK6. For JDK6 and greater, a "GetVersion" kamg@677: * function exists in libjava.so and we simply call it during the kamg@677: * 'initialize()' call to find the version. For JDKs with version < 6, no kamg@677: * such call exists and we have to probe the JDK in order to determine kamg@677: * the exact version. This probing cannot happen during late in kamg@677: * the VM initialization process so there's a period of time during kamg@677: * initialization when we don't know anything about the JDK version other than kamg@677: * that it less than version 6. This is the "partially initialized" time, kamg@677: * when we can answer only certain version queries (such as, is the JDK kamg@677: * version greater than 5? Answer: no). Once the JDK probing occurs, we kamg@677: * know the version and are considered fully initialized. kamg@677: */ kamg@677: class JDK_Version VALUE_OBJ_CLASS_SPEC { duke@435: friend class VMStructs; kamg@677: friend class Universe; kamg@677: friend void JDK_Version_init(); duke@435: private: kamg@677: kamg@677: static JDK_Version _current; twisti@3884: static const char* _runtime_name; sla@4232: static const char* _runtime_version; kamg@677: kamg@677: // In this class, we promote the minor version of release to be the kamg@677: // major version for releases >= 5 in anticipation of the JDK doing the kamg@677: // same thing. For example, we represent "1.5.0" as major version 5 (we kamg@677: // drop the leading 1 and use 5 as the 'major'). kamg@677: kamg@677: uint8_t _major; kamg@677: uint8_t _minor; kamg@677: uint8_t _micro; kamg@677: uint8_t _update; kamg@677: uint8_t _special; kamg@677: uint8_t _build; kamg@677: kamg@677: // If partially initialized, the above fields are invalid and we know kamg@677: // that we're less than major version 6. kamg@677: bool _partially_initialized; kamg@677: kamg@677: bool _thread_park_blocker; ysr@3117: bool _pending_list_uses_discovered_field; kevinw@2449: bool _post_vm_init_hook_enabled; kamg@677: kamg@677: bool is_valid() const { kamg@677: return (_major != 0 || _partially_initialized); kamg@677: } kamg@677: kamg@677: // initializes or partially initializes the _current static field kamg@677: static void initialize(); kamg@677: kamg@677: // Completes initialization for a pre-JDK6 version. kamg@677: static void fully_initialize(uint8_t major, uint8_t minor = 0, kamg@677: uint8_t micro = 0, uint8_t update = 0); duke@435: duke@435: public: duke@435: kamg@677: // Returns true if the the current version has only been partially initialized kamg@677: static bool is_partially_initialized() { kamg@677: return _current._partially_initialized; kamg@677: } kamg@611: kamg@677: JDK_Version() : _major(0), _minor(0), _micro(0), _update(0), kamg@677: _special(0), _build(0), _partially_initialized(false), ysr@3117: _thread_park_blocker(false), _post_vm_init_hook_enabled(false), ysr@3117: _pending_list_uses_discovered_field(false) {} kamg@677: kamg@677: JDK_Version(uint8_t major, uint8_t minor = 0, uint8_t micro = 0, kamg@677: uint8_t update = 0, uint8_t special = 0, uint8_t build = 0, ysr@3117: bool thread_park_blocker = false, bool post_vm_init_hook_enabled = false, ysr@3117: bool pending_list_uses_discovered_field = false) : kamg@677: _major(major), _minor(minor), _micro(micro), _update(update), kamg@677: _special(special), _build(build), _partially_initialized(false), kevinw@2449: _thread_park_blocker(thread_park_blocker), ysr@3117: _post_vm_init_hook_enabled(post_vm_init_hook_enabled), ysr@3117: _pending_list_uses_discovered_field(pending_list_uses_discovered_field) {} kamg@677: kamg@677: // Returns the current running JDK version kamg@677: static JDK_Version current() { return _current; } kamg@677: kamg@677: // Factory methods for convenience kamg@677: static JDK_Version jdk(uint8_t m) { kamg@677: return JDK_Version(m); kamg@677: } kamg@677: kamg@677: static JDK_Version jdk_update(uint8_t major, uint8_t update_number) { kamg@677: return JDK_Version(major, 0, 0, update_number); kamg@677: } kamg@677: kamg@677: uint8_t major_version() const { return _major; } kamg@677: uint8_t minor_version() const { return _minor; } kamg@677: uint8_t micro_version() const { return _micro; } kamg@677: uint8_t update_version() const { return _update; } kamg@677: uint8_t special_update_version() const { return _special; } kamg@677: uint8_t build_number() const { return _build; } kamg@677: kamg@677: bool supports_thread_park_blocker() const { kamg@677: return _thread_park_blocker; kamg@677: } kevinw@2449: bool post_vm_init_hook_enabled() const { kevinw@2449: return _post_vm_init_hook_enabled; kevinw@2449: } ysr@3117: // For compatibility wrt pre-4965777 JDK's ysr@3117: bool pending_list_uses_discovered_field() const { ysr@3117: return _pending_list_uses_discovered_field; ysr@3117: } kamg@677: kamg@677: // Performs a full ordering comparison using all fields (update, build, etc.) kamg@677: int compare(const JDK_Version& other) const; kamg@677: kamg@677: /** kamg@677: * Performs comparison using only the major version, returning negative kamg@677: * if the major version of 'this' is less than the parameter, 0 if it is kamg@677: * equal, and a positive value if it is greater. kamg@677: */ kamg@677: int compare_major(int version) const { kamg@677: if (_partially_initialized) { kamg@677: if (version >= 6) { kamg@677: return -1; kamg@677: } else { kamg@677: assert(false, "Can't make this comparison during init time"); kamg@677: return -1; // conservative kamg@677: } kamg@611: } else { kamg@677: return major_version() - version; kamg@611: } kamg@611: } kamg@611: kamg@677: void to_string(char* buffer, size_t buflen) const; kamg@677: twisti@3884: static const char* runtime_name() { twisti@3884: return _runtime_name; twisti@3884: } twisti@3884: static void set_runtime_name(const char* name) { twisti@3884: _runtime_name = name; twisti@3884: } twisti@3884: sla@4232: static const char* runtime_version() { sla@4232: return _runtime_version; sla@4232: } sla@4232: static void set_runtime_version(const char* version) { sla@4232: _runtime_version = version; sla@4232: } sla@4232: kamg@677: // Convenience methods for queries on the current major/minor version kamg@677: static bool is_jdk12x_version() { kamg@677: return current().compare_major(2) == 0; kamg@611: } duke@435: kamg@677: static bool is_jdk13x_version() { kamg@677: return current().compare_major(3) == 0; kamg@677: } kamg@677: kamg@677: static bool is_jdk14x_version() { kamg@677: return current().compare_major(4) == 0; kamg@677: } kamg@677: kamg@677: static bool is_jdk15x_version() { kamg@677: return current().compare_major(5) == 0; kamg@677: } kamg@677: kamg@677: static bool is_jdk16x_version() { kamg@677: return current().compare_major(6) == 0; kamg@677: } kamg@677: kamg@677: static bool is_jdk17x_version() { kamg@677: return current().compare_major(7) == 0; kamg@677: } kamg@677: brutisso@3767: static bool is_jdk18x_version() { brutisso@3767: return current().compare_major(8) == 0; brutisso@3767: } brutisso@3767: kamg@677: static bool is_gte_jdk13x_version() { kamg@677: return current().compare_major(3) >= 0; kamg@677: } duke@435: duke@435: static bool is_gte_jdk14x_version() { kamg@677: return current().compare_major(4) >= 0; duke@435: } kamg@677: duke@435: static bool is_gte_jdk15x_version() { kamg@677: return current().compare_major(5) >= 0; duke@435: } kamg@677: duke@435: static bool is_gte_jdk16x_version() { kamg@677: return current().compare_major(6) >= 0; duke@435: } duke@435: duke@435: static bool is_gte_jdk17x_version() { kamg@677: return current().compare_major(7) >= 0; duke@435: } brutisso@3767: brutisso@3767: static bool is_gte_jdk18x_version() { brutisso@3767: return current().compare_major(8) >= 0; brutisso@3767: } duke@435: }; stefank@2314: stefank@2314: #endif // SHARE_VM_RUNTIME_JAVA_HPP